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; //返回前綴
}