Q:给定一个字符串,输出该字符串的最长回文子串
S1:暴力匹配
- 获取每一个子串;
- 获取每一个子串的反向字符串;
- 比较子串与其反向字符串;
- 相等则为回文子串;
- 找出最长的回文子串;
public String longestPalindrome(String s){
//获取字符串长度
int l=s.length();
//构建最长回文子串
String str="";
for (int i = 0; i <= l-1; i++) {
for (int j = i+1; j < l+1; j++) {
//获取每个子串
String sub = s.substring(i, j);
//获取子串的反向字符串
String reSub = new StringBuilder(sub).reverse().toString();
//判断是否为回文&&判断是否为最长的回文子串
if(sub.equals(reSub) && sub.length()>=str.length()){
str=sub;
}
}
}
return str;
}
S2:递归分解
- 获取字符串的反向字符串;
- 判断字符串与反向字符串是否相等;
- 相等直接return;
- 不相等则将字符串去掉最左边的字符,然后再执行1,获得子串01;
- 将字符串还原,然后去掉最右边的字符,然后再执行1,获得子串02;
- 判断子串01和子串02的长度,返回最长的那个子串;
public String longestPalindrome(String s) {
StringBuilder str=new StringBuilder(s);
StringBuilder strRe=new StringBuilder(s);
strRe.reverse();
if(str.toString().equals(strRe.toString())){
return str.toString();
}else{
char c = str.charAt(0);
String s1 = longestPalindrome(str.deleteCharAt(0).toString());
str.insert(0,c);
String s2 = longestPalindrome(str.deleteCharAt(str.length() - 1).toString());
if(s1.length()>s2.length()){
return s1;
}else{
return s2;
}
}
}