[LeetCode ]Longest Palindromic Substring

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GYH0730/article/details/84109255

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

题意:找出一个字符串中最长的回文串

思路:最高效的方法就是马拉车算法,不过这道题数据量比较小,直接枚举回文串的中心字符,以中心字符向两边扩展,知道向两边扩展的字符不相等,这里为了避免奇数和偶数两种情况的讨论,也利用到了马拉车的部分思想,给每两个连续的字符中间加一个特殊字符,首尾再加两个不一样的特殊字符。

Java代码:

public class Solution {
	public String longestPalindrome(String s) {
		if(s.equals("")) return "";
		String ss,ans;
		ss = ans = "";
		int len = s.length();
		ss += "~";
		for(int i = 0; i < len; i++) {
			ss += s.charAt(i);
			ss += '$';
		}
		ss += '@';
		int Max,_l,_r,l,r,cnt;
		Max = _r = _l = 0;
		//System.out.println(ss);
		for(int i = 1; i < ss.length() - 1; i++) {
			if(ss.charAt(i) != '$') cnt = 1;
			else cnt = 0;
			l = i - 1;
			r = i + 1;
			while(ss.charAt(l) == ss.charAt(r)) {
				if(ss.charAt(l) != '$') cnt += 2;
				l--;
				r++;
				//System.out.println(l + " " + r);
			}
			if(Max < cnt) {
				Max = cnt;
				_l = l + 1;
				_r = r - 1;
			}
		}
		for(int i = _l; i <= _r; i++) {
			if(ss.charAt(i) != '$') {
				ans += ss.charAt(i);
			}
		}
		return ans;
    }
}

C代码,返回字符串要用malloc来申请内存,传入的字符串可能为空,要特判一下,不然会RE。

char* longestPalindrome(char* s) {
    if(strcmp(s,"") == 0) {
        return "";
    }
    char ss[2015];
    int len = strlen(s);
    int Max = 0,i;
    ss[0] = '~';
    int cnt = 1;
    for(i = 0; i < len; i++) {
        ss[cnt++] = s[i];
        ss[cnt++] = '$';
    }
    int left = 1,right = cnt - 2;
    int al,ar;
    char* ans = (char*) malloc(sizeof(char) * 1005);
    for(i = left; i <= right; i++) {
        if(ss[i] != '$') cnt = 1;
        else cnt = 0;
        int l = i - 1,r = i + 1;
        while(l >= left && r <= right && ss[l] == ss[r]) {
            if(ss[l] != '$') {
                cnt += 2;
            }
            l--,r++;
        }
        if(Max < cnt) {
            Max = cnt;
            if(ss[l] != ss[r]) {
                l++,r--;
            }
            al = l;
            ar = r;
        }
    }
    cnt = 0;
    for(i = al; i <= ar; i++) {
        if(ss[i] != '$') {
            ans[cnt++] = ss[i];
        }
    }
    ans[cnt++] = '\0';
    return ans;
}

猜你喜欢

转载自blog.csdn.net/GYH0730/article/details/84109255