1.最长公共子前缀
思路: 这个题思路是比较好想的。先检查数组是否为空,为空则直接返回“”。然后拿第一个字符串跟后面的字符串进行比较,若存在公共子前缀则用它更新,作为比较的字符串进行后续的比较。最后判断一下得到的公共子前缀是否为空。
这里需要用到关于字符串的函数:
①charAt(int index):返回指定位置的字符。第一个字符位置为 0, 第二个字符位置为 1,以此类推.
②返回字符串的子字符串
substring(int beginIndex)
substring(int beginIndex, int endIndex)这里不包含endindex代表的字符
③length():返回字符串的长度。String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数
需要区别于数组长度,例如数组a的长度:a.length
④字符串比较需要用函数:equals(Object a)
代码实例:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0)
return "";
String temp=strs[0];
for(int i=1;i<strs.length;i++) {
int j=0;
for(;j<temp.length()&&j<strs[i].length();j++) {
if(temp.charAt(j)!=strs[i].charAt(j))
break;
}
temp=temp.substring(0,j);
if(temp.equals(""))
return temp;
}
return temp;
}
}
2.最长回文子串
思路:
方法①动态规划:回文串正序逆序后都是一样的。所以可以把字符串逆序之后,正序串跟逆序串对比,找出最长公共字符串。不过最后需要判断一下。
以防这种情况的出现,也存在公共子串,其实不是回文串,这个需要判断一下串的位置就好。
需要注意防止越界
代码实例:
class Solution {
public String longestPalindrome(String s) {
if(s.equals(""))
return "";
String before =s;
String reverse=new StringBuffer(s).reverse().toString();
int l=s.length();
//定义二维数组存储公共字符串的长度
int [][]temp=new int[l][l];
int maxl=0;
int maxend=0;
//动态规划寻找最长公共字符串
for(int i=0;i<l;i++) {
for(int j=0;j<l;j++) {
if(before.charAt(i)==reverse.charAt(j)) {
if (i==0||j==0) {
temp[i][j]=1;
}
else{
temp[i][j]=temp[i-1][j-1]+1;
}
}
if (temp[i][j]>maxl) {
int br=s.length()-1-j;
if(i==br+temp[i][j]-1){
maxl=temp[i][j];
maxend=i;
}
}
}
}
return before.substring(maxend-maxl+1, maxend+1);
}
}
方法