1 最长公共前缀
class Solution { public String longestCommonPrefix(String[] strs) { if (strs==null || strs.length==0) return ""; int length = strs[0].length();//第一个字符串的长度 int count = strs.length;//总共有几个字符串 for (int i = 0; i < length; i++) {//第一个字符串中每一个字符循环 char c = strs[0].charAt(i); //这个字符 for (int j = 1; j < count; j++) {//循环所有字符串 if (i == strs[j].length() || strs[j].charAt(i) != c) { return strs[0].substring(0, i); } } } return strs[0]; } }
2 最长回文子串
一个判断字符串是否为回文字符串的代码:
public boolean vaildPalindromic(char [] array,int left,int right) { while(left<right) { if(array[left]!=array[right]) { return false; } left++; right--; } return true; }
1 暴力方法:
class Solution { public String longestPalindrome(String s) { int len=s.length(); int maxlen=1; int begin=0; //将字符串变为字符串数组 char[] charArray=s.toCharArray(); //枚举所有长度大于1的子串 for(int i=0;i<len-1;i++) { for(int j=i+1;j<len;j++) { if(j-i+1>maxlen&&vaildPalindromic(charArray,i,j)) { maxlen=j-i+1; begin=i; } } } return s.substring(begin,begin+maxlen); } //判断字符串是否为回文字符串 public boolean vaildPalindromic(char [] array,int left,int right) { while(left<right) { if(array[left]!=array[right]) { return false; } left++; right--; } return true; } }
2 动态规划
class Solution { public String longestPalindrome(String s) { int len=s.length(); int maxlen=1; int begin=0; //将字符串变为字符串数组 char[] charArray=s.toCharArray(); // 动态规划 初始化 boolean[][] dp=new boolean[len][len]; for(int i=0;i<len;i++) { dp[i][i]=true; } //填写状态 // 填表规则:先一列一列的填写,再一行一行的填, //保证左下方的单元格先进行计算 for(int j=1;j<len;j++) { for(int i=0;i<j;i++) { //判断这个字符串头尾是否相等,不相等直接false if(charArray[i]!=charArray[j]) { dp[i][j]=false; }else { //如果头尾相等,判断去头去尾是否是回文 if (j - i < 3){ dp[i][j] = true; }else { //状态转移 dp[i][j] = dp[i + 1][j - 1]; } if (dp[i][j] && j - i + 1 > maxlen){ maxlen = j - i + 1; begin = i; } } } } return s.substring(begin,begin+maxlen); } }
3 翻转字符串里的单词