647 回文子串
思路:回文子串是对字符串的子串进行判断,看是否为回文子串。子串分为奇数偶数的情况,抽出一个方法分别对奇偶情况进行判断。定义左右指针,对指针区间进行是否回文,奇数以一个元素为中心,偶数以两个元素为中心,判断中心两边是否相等。
public int countSubstrings(String s) {
int res=0;
for(int i=0;i<s.length();i++){
res+=HuiWenZiChuan(s,i,i); //奇数子串
res+=HuiWenZiChuan(s,i,i+1); //偶数子串
}
return res;
}
public int HuiWenZiChuan(String s,int l,int r){
int count=0;
while(l>=0&&r<s.length()&&s.charAt(l)==s.charAt(r)){ //以子串为中心判断两边是否相等
l--;
r++;
count++;
}
return count;
}
28 实现strStr()
思路:双指针,i指针控制haystack,j指针控制needle,i和j进行相等匹配,相等两个指针同时移动,不等回溯,从第二个元素开始进行匹配。
public int strStr(String haystack, String needle) {
int i=0;
int j=0;
if(needle.length()==0)
return 0;
while(i<haystack.length()){
if(needle.charAt(j)==haystack.charAt(i)){ //匹配
i++;
j++;
if(j==needle.length()){
return i-j; //出现下标
}
}else{
i=i-j+1; //回溯
j=0;
}
}
return -1;
}
58 最后一个单词的长度
思路:定义end指针,从字符串最后一位开始,碰到空格前移,停在最后一个字母的位置,start指针从end位置开始左移,碰到空格后停止。end-start为最后一个单词长度。
public int lengthOfLastWord(String s) {
int end=s.length()-1;
while(end>=0&&s.charAt(end)==' '){ //去掉最后一个单词后的空格
end--;
}
if(end<0){
return 0;
}
int start=end;
while(start>=0&&s.charAt(start)!=' '){ //找到单词开始的位置
start--;
}
return end-start; //单词长度
}
14 最长公共前缀
思路:调用indexOf()方法判断后面的字符串是否是第一个字符串的子串,如果不是,调用substring()对第一个字符串进行一点一点截取,直到第一个字符串是后面所有字符串的子串为止,返回str为公共前缀。
public String longestCommonPrefix(String[] strs) {
if(strs.length==0)
return "";
String str = strs[0];
for(int i=1;i<strs.length;i++){
while(strs[i].indexOf(str)!=0){ //第一个字符串不是后面每一个字符串的子串
str=str.substring(0,str.length()-1); //对第一个字符串进行截取
if(str.isEmpty())
return "";
}
}
return str; //返回前缀
}