344. 反转字符串#
1
2
3
4
5
6
7
8
9
10
|
class Solution {
public void reverseString(char[] s) {
char temp;
for(int i=0;i<s.length/2;i++){
temp = s[i];
s[i] = s[s.length-1-i];
s[s.length-1-i] = temp;
}
}
}
|
541. 反转字符串 II#
字符串切割从第 i 位置到 k + i - 1 才是切下 k 个字符 .
判断条件没有很复杂,就是拿到的个数 > k 就操作反转前 k 个, < k 直接全反转.
就是 ≥2k 和 2k ≥ len ≥ k ,两个区间都是用一操作,融合了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i+=2*k){
char temp ;
int begin = i, end = Math.min(i+k-1,ch.length-1);
while(begin < end){
temp = ch[begin];
ch[begin] = ch[end];
ch[end] = temp;
begin++;
end--;
}
}
return new String(ch);
}
}
|
剑指Offer 05.替换空格#
注意 : 只有 String 转换为了 StringBuffer or StringBuilder 才能用 append && toString 方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Solution {
public String replaceSpace(String s) {
int count = 0,i = 0;
for(char c : s.toCharArray())
if(c == ' ') count++;
char[] ch = new char[s.length()+2*count];
for(char c : s.toCharArray()){
if(c == ' '){
ch[i++] = '%';
ch[i++] = '2';
ch[i++] = '0';
}
else
ch[i++] = c;
}
return new String(ch);
}
}
|
151. 翻转字符串里的单词#
思路:先全部反转、再依次反转各个 word。
记住几个 API : charAt、setChatAt,操作 String 先转换成 StringBuilder or StringBuffer 再操作。
注意要移除开头结尾的 space、word 间连续的 space。
其中去除连续的 space 注意判断条件 当前 char != space || sb最后一个 char 不为 space(上一个 char 不为 space),两个判断条件反了会短路。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
class Solution {
public String reverseWords(String s) {
//删除开头结尾中间的空格
StringBuilder sb = removeSpace(s);
reverseString(sb,0,sb.length()-1);
reverseEachWord(sb);
return sb.toString();
}
public StringBuilder removeSpace(String s){
int left = 0, right = s.length()-1;
StringBuilder sb = new StringBuilder();
while(s.charAt(left) == ' ') left++;
while(s.charAt(right) == ' ') right--;
while(right >= left){
if(s.charAt(left) != ' ' || sb.charAt(sb.length()-1) != ' ') sb.append(s.charAt(left));
left++;
}
return sb;
}
public void reverseString(StringBuilder sb,int left,int right){
while(left < right){
char temp = sb.charAt(left);
sb.setCharAt(left,sb.charAt(right));
sb.setCharAt(right,temp);
left++;
right--;
}
}
public void reverseEachWord(StringBuilder sb){
int left = 0,right;
while(left < sb.length()-1){
right = left+1;
while(right != sb.length() && sb.charAt(right) != ' ')//为什么不是len-1? 因为最后是right-1当右边界操作。并且&&先后顺序乱了就会越界。
right++;
reverseString(sb,left,right-1);
left = right+1;
}
}
}
|
剑指Offer58-II.左旋转字符串#
思路:把 n 后面的先 append 到 new 的 sb 上,再把 n 之前的 append 到 sb 。
1
2
3
4
5
6
7
8
9
10
|
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder();
for(int i=n;i<s.length();i++)
sb.append(s.charAt(i));
for(int i=0;i<n;i++)
sb.append(s.charAt(i));
return sb.toString();
}
}
|
28. 实现 strStr()#
KMP
459. 重复的子字符串#
KMP
持续更新…….
如有错误,敬请斧正!!!