leetcode 5最长回文子串(C#)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/moon_goes/article/details/102304033

题目

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

示例 2:
输入: “cbbd”
输出: “bb”

解题

解法一:中心扩散法。
回文串有两种情况:
1.回文串以单个字符对称,例如【“abcba”】以“c”字符为中心,两边对称;
2.回文串以两个字符对称,例如【“nccn”】以“cc”两个字符为中心对称;

以此为前提,我们声明一个int变量i遍历字符串中每一个字符,因为我们事先并不知道要找的回文串是单字符对称还是两个字符对称,所以针对每一个字符,我们都要用单、双字符的情况来验证。验证方法一样,只是中心不同。
单字符对称回文串:以(i)为中心,向两边扩散;
双字符对称回文串:以(i)与(i+1)为中心,向两边扩散。

接下来就是边界条件的限定,用L指向i左边的字符,R指向i右边的字符,也就是在判断过程中,L不能超过第一个字符,即s[0],R向右不能超过最后一个字符,即s[s.Length]。如果s[L]==s[R],那么满足回文串的条件,L和R继续往两边扩散。然后比较单、双为中心,哪种得到的结果长一些,并不断刷新结果。

需要注意的点:
1.在中心扩展方法中,计算字符串长度的公式为R-L-1
为什么是R-L-1呢?我们知道,一般计算a~b(a<b)有几个数,通常是b-a+1,例如 1—5有【1、2、3、4、5】即5-1+1=5个数。按照这个道理,字符串长度应该是R-L+1才对。但是结合上面的while循环我们发现,R-L-1计算的时机是当【L >= 0 && R < s.Length && s[L] == s[R]】这串条件不满足了才进行计算,也就是说,当前L和R指针指向的两个字符并不属于回文串,所以我们用R-L+1计算长度的时候,还需要减去这两个字符,也就是R-L+1-2,即R-L-1的由来。

2.start和end的计算。
start=i-(len-1)/2;
end=i+len/2;
为什么计算start时len要减一呢?以单数为中心时,可以直接使用len/2;但是双数为中心时,因为start相较于end,更接近 i 这个中心,在数值上就体现为start到 i 的距离比end到 i 的距离多1(画图帮助理解)。所以用 i 计算start和end时,有一个1的区别。

public string LongestPalindrome(string s) {
         int start = 0;
            int end = 0;
        if(s.Length==0){
            return new string("");
        }
            for(int i = 0; i < s.Length; i++)
            {
                int len1 = expandFromCenter(s, i, i);
                int len2 = expandFromCenter(s, i, i + 1);
                int len = Math.Max(len1, len2);
                if (len > end - start)
                {
                    start = i - (len - 1) / 2;
                    end = i + len / 2;
                }
            }
            return s.Substring(start, end - start + 1);
        }

        int expandFromCenter(string s,int left,int right)
        {
            int L = left, R = right;
            while (L >= 0 && R < s.Length && s[L] == s[R])
            {
                L--;
                R++;
            }
            return R - L - 1;
        }

代码参考:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/5-zui-chang-hui-wen-zi-chuan-cc-by-bian-bian-xiong/

猜你喜欢

转载自blog.csdn.net/moon_goes/article/details/102304033