相应leetcode题目
leetcode 第5题. 最长回文子串
1.回文串
即从两边开始到中间,对应的字符都相同
public boolean isPalindrome(String str){
int i=0,j=str.length();
while (i<j){
if(str.charAt(i++)!=str.charAt(j++)){
return false;
}
}
return true;
}
从leetcode 第5题的示例输出: “bab” 和 “bb” , 回文串的长度有奇偶之别 ,长度为偶数的回文串不能从其本身的字符来确定中心对称点 ,因此可以添加辅助字符来帮助确定中心对称的字符: ( 添加的辅助字符必须是回文串中未曾出现过的字符)
假设对于只用26个小写字母构成的字符串而言 ,则可以用一些标点符号来充当辅助字符 ,比如 ‘#’ 。 那么对于题中示例长度为偶数的回文串 ,添加辅助字符后可以形成 " #b#b# " ,该字符串则以 ‘#’ 成中心对称 。
对与长度为奇数的回文串 ,尝试添加同样的辅助字符 ,同样也不影响其对称的特点 ,如 " #b#a#b# "。 因此可以不管字符串的长度 ,都添加辅助字符来帮助确定回文串的中心 。
2.寻找字符串中的回文子串
上面通过添加辅助字符可以确定回文串的对称中心 ,同样 ,对于寻找字符串中的回文子串 ,也可以添加辅助字符来帮助寻找 。
既然回文串关于中心对称 ,那可以用中心扩散法( 以某一个字符为中心 ,从中间向两边 ,匹配两边的每一个字符 )在字符串中找回文子串 ,即遍历字符串中的每个字符 ,在遍历的过程中 ,以每个字符为中心向两边扩散 ,寻找回文子串 。
如 ,在 " cabafabae " 中寻找回文子串 ,先添加辅助字符形成 "#c#a#b#a#f#a#b#a#e " ,然后遍历该字符串的每个字符 ,并在遍历的过程中 ,以每个字符为中心向两边扩散 。
在扩散的过程中 ,比如在遍历字符串 " #c#a#b#a#f#a#b#a#e " 到字符 ‘f’ 的时候 ,已经可以确定的回文子串有 ” #a#b#a#f#a#b#a# “ 和 ” #a#b#a# “ 等等,那么在接下来继续遍历右边字符 ’b‘ 的时候 ,可以根据回文串对称的特点,确定字符 ’f‘ 右边的也有一个关于以 ’b‘ 字符为中心的回文子串 ” #a#b#a#