大家好,欢迎来到IT知识分享网。
问题一
利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
解决方法
使用StringBuilder
StringBuilder 解决大量拼接字符串时产生很多中间对象问题而提供的类
提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置
例:str =“aaaabbccccddeaaa” 压缩为”4a2b4c2d1e3a”
代码
public String zipString(String iniString) {
/**
* 字符串压缩 使用StringBuilder
* StringBuilder 解决大量拼接字符串时产生很多中间对象问题而提供的类
* 提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置
* 例:str ="aaaabbccccddeaaa" 压缩为"4a2b4c2d1e3a"
* **/
StringBuilder sb = new StringBuilder();
int len = iniString.length();
int low = 0, high = 0;
int count = 0;
char c = ' ';
while(low < len){
high = low;
c = iniString.charAt(low);
while((high < len) && (iniString.charAt(high) == c)){
high++;
}
count = high - low;
sb.append(c);
sb.append(count);
low = high;
}
return (sb.toString().length() < len) ? sb.toString() : iniString;
}
版权声明:本文为CSDN博主「奕起学习」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29606255/article/details/78477517
问题二
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-compression
443.压缩字符串
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度
示例 1:
输入:
[“a”,“a”,“b”,“b”,“c”,“c”,“c”]
输出:
返回6,输入数组的前6个字符应该是:[“a”,“2”,“b”,“2”,“c”,“3”]
说明:
“aa”被”a2″替代。”bb”被”b2″替代。”ccc”被”c3″替代。
示例 2:
输入:
[“a”]
输出:
返回1,输入数组的前1个字符应该是:[“a”]
说明:
没有任何字符串被替代。
示例 3:
输入:
[“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]
输出:
返回4,输入数组的前4个字符应该是:[“a”,“b”,“1”,“2”]。
说明:
由于字符”a”不重复,所以不会被压缩。”bbbbbbbbbbbb”被“b12”替代。
注意每个数字在数组中都有它自己的位置。
解决方法
此题要求使用原地算法求解,即将压缩结果存在原chars[]数组中.
使用双指针即可求解此题.这里我们称由相同字符组成的字符串为相同字符序列.
指针t指示已压缩的结果的末尾,指针i指示未压缩字符串的开头.
遇到相同的字符,指针i便向后滑动,直到遇到不同字符.指针i滑动的距离即为相同字符序列的长度.
代码
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++;
//若相同字符序列长度大于1
if(i - temp > 1){
//向结果中加入相同字符序列的长度的字符形式
//String.valueOf 将基本数据类型转化为String
for(char c : String.valueOf(i - temp).toCharArray()){
chars[t++] = c;
}
}
}
//t即为已压缩的结果的长度
return t;
}
作者:FlyChenKai
链接:https://leetcode-cn.com/problems/two-sum/solution/shuang-zhi-zhen-fa-qiu-ya-suo-zi-fu-chuan-java-by-/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14884.html