第四章 字符串part02
今日任务
● 151.翻转字符串里的单词
● 卡码网:55.右旋转字符串
● 28. 实现 strStr()
● 459.重复的子字符串
● 字符串总结
● 双指针回顾
详细布置
151.翻转字符串里的单词
建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html
卡码网:55.右旋转字符串
建议:题解中的解法如果没接触过的话,应该会想不到
题目链接/文章讲解:
https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html
28. 实现 strStr()
因为KMP算法很难,大家别奢求 一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会 好懂很多。
或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。
因为大家 算法能力还没到,细扣 很难的算法,会把自己绕进去,就算别人给解释,只会激发出更多的问题和疑惑。所以大家先了解大体过程,知道这么回事, 等自己有 算法基础和思维了,在看多看几遍视频,慢慢就理解了。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html
459.重复的子字符串
本题算是KMP算法的一个应用,不过 对KMP了解不够熟练的话,理解本题就难很多。
我的建议是 KMP和本题,一刷的时候 ,可以适当放过,了解怎么回事就行,二刷的时候再来硬啃
题目链接/文章讲解/视频讲解:https://programmercarl.com/0459.%E9%87%8D%E5%A4%8D%E7%9A%84%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html
字符串总结
比较简单,大家读一遍就行
题目链接/文章讲解:https://programmercarl.com/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%80%BB%E7%BB%93.html
双指针回顾
此时我们已经做过10道双指针的题目了,来一起回顾一下,大家自己也总结一下双指针的心得
文章讲解:https://programmercarl.com/%E5%8F%8C%E6%8C%87%E9%92%88%E6%80%BB%E7%BB%93.html
151.翻转字符串里的单词
题目链接
解题思路
使用split函数就是一道水题了
1.移除多余空格
2.将整个字符串反转
3.将每个单词反转
举个例子,源字符串为:"the sky is blue "
移除多余空格 : “the sky is blue”
字符串反转:“eulb si yks eht”
单词反转:“blue is sky the”
code
//1.移除多余空格
//2.反转字符串
//3.反转每个单词
public String reverseWords(String s) {
StringBuilder sb =removeElement(s);
reverseStr(sb,0,sb.length()-1);
reverseEachWord(sb);
return sb.toString();
}
public StringBuilder removeElement(String s){
int start=0;
int end=s.length()-1;
while(s.charAt(start)==' ') start++;
while (s.charAt(end) == ' ') end--;
StringBuilder sb=new StringBuilder();
while(start<=end){//start<=end 是因为要处理最后一个字符串
if(s.charAt(start)!=' '|| sb.charAt(sb.length()-1)!=' '){
sb.append(s.charAt(start));
}
start++;
}
return sb;
}
public void reverseStr(StringBuilder sb,int start,int end){
while(start<end){//start<end 是因为剩余一个字符串不需要交换了
char temp=sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;
end--;
}
}
public void reverseEachWord(StringBuilder sb){
int slow=0;
for(int i=0;i<sb.length();i++){
if(sb.charAt(i)==' '){
reverseStr(sb,slow,i-1);
slow=i+1;
}else if(i==sb.length()-1){
reverseStr(sb,slow,i);
}
}
}
卡码网:55.右旋转字符串
题目链接
解题思路
整体翻转
部分翻转
code
public static char[] rightRotate(int k,String str) {
char[] chars = str.toCharArray();
reverseStr(chars, 0, chars.length - 1);
reverseStr(chars, 0, k-1);
reverseStr(chars, k, chars.length - 1);
return chars;
}
public static void reverseStr(char[] str, int start, int end) {
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = Integer.parseInt(sc.nextLine());
String str = sc.nextLine();
System.out.println(rightRotate(k,str));
}
28. 实现 strStr()
题目链接
解题思路
code
28. 459.重复的子字符串
题目链接
解题思路
code