输入一个字符串,输出该字符串中对称的子字符串的最大长度。
public class LongestSymmtricalLength2 { /* * Q75题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。 * 比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 */ public static void main(String[] args) { String[] strs = { "a","google", "elgoog", "agollloge", "aba", "aaaaaa", }; for (String each : strs) { int len = longestSymmtricalLength(each); System.out.println("l1:" + len); len = longestSymmtricalLength2(each); System.out.println("l2:" + len); } } public static int longestSymmtricalLength(String str) { if (str == null || str.length() == 0) { return -1; } //去掉aa为1实际为2 的bug if(str.length()==2){ if(str.charAt(0)==str.charAt(1)) return 2; } int symLen = 1; char[] letter = str.toCharArray(); int strLen = str.length(); int curIndex = 1; while (curIndex > 0 && curIndex < strLen - 1) { // odd symmetrical length,the 'pivot' char is letter[curIndex] int i = curIndex - 1; int j = curIndex + 1; while (i >= 0 && j <= (strLen - 1) && letter[i] == letter[j]) { i--; j++; } int newLen = j - i - 1; if (newLen > symLen) { symLen = newLen; } // even symmetrical length,the 'pivot' chars are letter[curIndex] // and letter[curIndex+1] goog 就是用位置 1和2进行对称 i = curIndex; j = curIndex + 1; while (i >= 0 && j <= (strLen - 1) && letter[i] == letter[j]) { i--; j++; } newLen = j - i - 1; if (newLen > symLen) { symLen = newLen; } curIndex++; } return symLen; } /* * 上面的方法是从位置1,进行向外扩大半径进行搜索,比如google,currIndex=1;i=0;j=1;(因为对称相等就是回文),向外扩大半径搜索 * 改版之后的算法,不在区分奇偶 */ public static int longestSymmtricalLength2(String str) { if (str == null || str.length() == 0) { return -1; } StringBuffer buffer = new StringBuffer(); buffer.append("#"); for (int i = 0; i < str.length(); i++) { buffer.append(str.charAt(i) + "#"); } str = buffer.toString(); buffer.delete(0, buffer.length()); int symLen = 1; char[] letter = str.toCharArray(); int strLen = str.length(); int curIndex = 1; while (curIndex > 0 && curIndex < strLen - 1) { // odd symmetrical length,the 'pivot' char is letter[curIndex] int i = curIndex - 1; int j = curIndex + 1; while (i >= 0 && j <= (strLen - 1) && letter[i] == letter[j]) { i--; j++; } int newLen = (j - i - 1) / 2; if (newLen > symLen) { symLen = newLen; } curIndex++; } return symLen; } }