字符串压缩
此博客链接:https://www.cnblogs.com/ping2yingshi/p/12594549.html
字符串压缩(150min)
题目链接:https://leetcode-cn.com/problems/compress-string-lcci/
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
题解:
题意:给定一个字符串,统计相邻相同字母个数,并把相同字母的位置用一个字母加相同字母个数表示。
方法:统计相邻相同字母个数,把相同字母个数加入到出现的字母后面。
思路:
1.定义一个StringBuilder 类型的字符串str存放相同字母的一个字母。
2.定义一个统计相同字母个数的数组arr。
3.定义一个统计相同字母个数的变量len,从第二个字母开始遍历,如果后一个字母和前一个字母相同,则len加一。如果后一个字母和前一个字母不同则把后一个字母加入到str中,并把统计的相同字母个数赋 值给arr。
4.遍历str,把统计相同字母个数的数组arr中的数字加入到每个字母后面。
5.判断压缩的字符串是否比没有压缩前的字符串长度小。
说明:下面代码是没有成功的,也不知道为啥在统计相同字母个数的数组哪里长度越界。
代码如下:
class Solution { public String compressString(String S) { if(S.length()==0) return null; if(S.length()==1) return S; int len=1;//统计相同字母个数 int arr[]=new int[50000];//存储相同字母个数 int k=0;//数组下标 StringBuilder str=new StringBuilder("S.charAt(0)");//第一个字母存入 int i=0; for( i=1;i<S.length();i++)//从第二个字母开始遍历 { if(S.charAt(i)==(S.charAt(i-1)))//如果后一个字母和前一个字母相同 { len++;//统计相同字母个数 } else//后一个字母和前一个字母不相同时 { arr[k++]=len;//把统计相同字母的个数存入数组中 str=str.append(S.charAt(i));//把此时和前面一个字母不同的字母加入到字符串中 len=1;//重新统计相同字母个数 } } if(S.charAt(i-1)==(S.charAt(i-2)))//最后有两个及两个以上字母相同的情况在上面的if条件中只统计了个数,没有进入到else语句中,把最后相同字母个数存入数组中 { arr[k++]=len;//如果最后有两个及两个以上的字母相同,把统计相同字母的个数存入数组中 } for(int j=0;j<str.length();j++)//在每个字母后面加入个数 { str=str.append(arr[j]); } if(str.length()<S.length())//如果压缩后的字符串长度小于压缩前的,输出压缩的后的字符串 { return str.toString(); } else return S; } }
报错截图: