【字符串】【双指针翻转字符串+快慢指针】Leetcode 151 反转字符串中单词
- 解法1 双指针翻转字符串+快慢指针+更新数组大小
---------------🎈🎈题目链接🎈🎈-------------------
---------------🎈🎈解答链接🎈🎈-------------------
解法1 双指针翻转字符串+快慢指针+更新数组大小
1.翻转全部
2.删除空格(快慢指针) 这部分蛮难思考的
- 当slow不是0(为了排除最前面的一个(一堆)空格)时
且ch[fast]不是空格,ch[fast-1]是空格的时候————表示一个单词结束,另一个单词开始,此时给slow加空格再进行赋值- ch[fast]不是空格——不断遍历单词的时候,只需要把fast的值赋给slow即可
- 剩下的就是ch[fast]是空格的时候,那就不操作直接fast++
3.翻转单词
更新数组:char[] newch = Arrays.copyOf(ch, 4);
时间复杂度O(N)
- 翻转全部字符的操作需要遍历整个字符串,时间复杂度为O(n),其中n是字符串的长度。
- 删除空格的操作也需要遍历整个字符串,时间复杂度为O(n)。
- 翻转单词的操作需要遍历整个字符串,时间复杂度为O(n)。
空间复杂度O(N)
- 使用了一个字符数组ch来存储字符串的字符,空间复杂度为O(n),其中n是字符串的长度。
- 使用了一个新的字符数组newch来存储删除空格后的字符,空间复杂度为O(n)。
- 没有使用额外的空间,所以除了字符数组外,空间复杂度为O(1)。
class Solution {
public String reverseWords(String s) {
class Solution {
public String reverseWords(String s) {
// 1.翻转全部
// 2.删除空格
// 3.翻转单词
char[] ch = s.toCharArray();
// 1.翻转全部
int left = 0;
int right = ch.length-1;
while(left < right){
ch[left] ^= ch[right];
ch[right] ^= ch[left];
ch[left] ^= ch[right];
left++;
right--;
}
// 2.删除空格(快慢指针) 更新数组
// 慢指针不为0,快指针指向空格 直至遇到下一个字母后 ch[slow++] =' '
int slow = 0;
int fast = 0;
for(; fast < ch.length; fast++){
// 当slow不是0(为了排除最前面的一个(一堆)空格)时,
// 且ch[fast]不是空格,ch[fast-1]是空格的时候————表示一个单词结束,另一个单词开始,此时给slow加空格再进行赋值
if(slow != 0 && ch[fast] != ' ' && ch[fast-1] == ' '){
ch[slow++] = ' ';
ch[slow++] = ch[fast];
}
// ch[fast]不是空格——不断遍历单词的时候,只需要把fast的值赋给slow即可
else if(ch[fast] != ' '){
ch[slow++] = ch[fast];
}
// 剩下的就是ch[fast]是空格的时候,那就不操作直接fast++
}
char[] newch = Arrays.copyOf(ch, slow); // 更新数组
// 3.翻转单词
int left2 = 0;
for(int i = 0; i <= newch.length; i++){
if(i == newch.length || newch[i] == ' ' ){
int right2 = i-1;
while(left2 < right2){
newch[left2] ^= newch[right2];
newch[right2] ^= newch[left2];
newch[left2] ^= newch[right2];
left2++;
right2--;
}
left2 = i+1;
}
}
return new String(newch);
}
}