leetcode(String)–443. 压缩字符串
1,题目:
2,思路:
方法一:滑动窗口:
利用滑动窗口法,左右指针起点都为原数组的首位。
实现步骤如下:
- 1.不断右移右指针,使窗口不断增大;
- 2.当窗口内出现一个不同的元素时,就可以将元素及其数量(等于左右指针之差)更新在数组中,然后让左指针指向右指针;
- 3.遍历到最后一个字符时也需要结算,因此将右指针的终点设为数组之外一格。当右指针移到终点时也要更新数组。
方法二:双指针:
-
遍历字符串
-
取相同字符序列的首字符存下
-
记录相同字符序列首元素位置
-
i指针滑动到相同字符序列末尾的下一个位置
-
i若相同字符序列长度大于1
-
向结果中加入相同字符序列的长度的字符形式
-
t即为已压缩的结果的长度
看题解中还有栈的方法来解。这里没有写,等以后看懂了在写。
3,代码:
方法一:滑动窗口:
//滑动窗口:
/*
利用滑动窗口法,左右指针起点都为原数组的首位。
实现步骤如下:
1.不断右移右指针,使窗口不断增大;
2.当窗口内出现一个不同的元素时,就可以将元素及其数量(等于左右指针之差)更新在数组中,然后让左指针指向右指针;
3.遍历到最后一个字符时也需要结算,因此将右指针的终点设为数组之外一格。当右指针移到终点时也要更新数组。
*/
class Solution {
public int compress(char[] chars) { // 数组大小范围: 1 <= chars.length <= 1000
int left = 0;
int size = 0;
// 由于最后一个字符也需要判断,所以将右指针终点放到数组之外一格
for (int right = 0; right <= chars.length; right++) {
// 当遍历完成,或右指针元素不等于左指针元素时,更新数组
if (right == chars.length || chars[right] != chars[left]) {
chars[size++] = chars[left]; // 更新字符
if (right - left > 1) { // 更新计数,当个数大于 1 时才更新
for(char c : String.valueOf(right - left).toCharArray()) {
chars[size++] = c;//向结果中加入相同字符序列的长度的字符形式
}
}
left = right;//然后让左指针指向右指针
}
}
return size;
}
}
方法二:双指针:
class Solution {
public int compress(char[] chars) {
int t=0;//设置指针
int i=0;
while (i <chars.length && t<chars.length) {//遍历字符串
chars[t++]=chars[i];//取相同字符序列的首字符存下
int temp=i;//记录相同字符序列首元素位置
while (i<chars.length &&chars[i]==chars[t-1])
i++;//i指针滑动到相同字符序列末尾的下一个位置
if(i-temp>1){//若相同字符序列长度大于1
for(char c:String.valueOf(i-temp).toCharArray()){//向结果中加入相同字符序列的长度的字符形式
chars[t++]=c;
}
}
}
return t;//t即为已压缩的结果的长度
}
}