一开始题目没读懂,下面是求首末是同一个字符的最长子字符串
:
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /* * 求首末是同一个字符的最长子字符串 * */ public class Sum22 { public String longestPalindrome(String s) { String string=""; int max= 0; for (int i = 0; i < s.length(); i++) { char a = s.charAt(i); for (int j = s.length()-1; j >= 0; j--) { char b= s.charAt(j); if(a==b){ string = j-i+1>string.length()?s.substring(i,j+1):string; } } } return string; } public static void main(String[] args) { String string = "abcdf"; System.out.println(string.substring(0,2)); } }
看到是求解最长回文串,也蒙逼了,不会写,这里参考的是:http://blog.csdn.net/linhuanmars/article/details/20888595
public class Sum22 { public String longestPalindrome(String s) { int len = 0; String result = ""; for (int i = 0; i < 2*s.length()-1; i++) { int left = i/2; int right = i/2; if(i%2==1){ right++; } String string = getSubString(s, right, left); if(len<string.length()){ len = string.length(); result = string; } } return result; } public String getSubString(String s,int right,int left){ while(left>=0&&right<s.length()&&s.charAt(right)==s.charAt(left)){ //left,right同时移动,并且在两个字符相同的情况下移动 left--; right++; } //while结束后,left比实际要的字符串最右侧位置小1,right要大1 return s.substring(left+1,right); //substring()是从start位置开始,end-1位置结束,注意不包括end } public static void main(String[] args) { } }
第二种方法是动态规划,没看太懂 http://blog.csdn.net/linhuanmars/article/details/20888595 http://blog.csdn.net/hopeztm/article/details/7932245
这里动态规划的思路是 dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。
则根据回文的规则我们可以知道:
如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]
当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。
import sun.net.www.content.text.plain; public class Sum22 { public String longestPalindrome(String s) { boolean[][] palin = new boolean[s.length()][s.length()]; if(s.length()==0||s==null){ return ""; } String res = ""; int len = 0; for (int i = s.length()-1; i >=0; i--) { for (int j = i; j < s.length(); j++) { // if(s.charAt(i)==s.charAt(j)&&(j-i<=2||palin[i+1][j-1]==true)){ / //这里j-i<=2的意思是i,j中间只有一个字符,palin[i+1][j-1]是靠里面的子字符串 palin[i][j] = true; if(j-i+1>len){ res = s.substring(i,j+1); len = j-i+1; } } } } return res; } public static void main(String[] args) { boolean[][] palin = new boolean[2][2]; System.out.println(palin[0][0]); } }