现给定一个string iniString字符串(长度小于等于10000),请按连续重复字母压缩的方式将该字符串压缩,返回结果为string,比如,字符串“aabbcccccaaa”经压缩会变成“a2b2c5a3”,若压缩后的字符串没有变短,则返回原先的字符串。注意保证串内字符均由大小写英文字母组成。
现给定一个string iniString字符串(长度小于等于10000),请按连续重复字母压缩的方式将该字符串压缩,返回结果为string,比如,字符串“aabbcccccaaa”经压缩会变成“a2b2c5a3”,若压缩后的字符串没有变短,则返回原先的字符串。注意保证串内字符均由大小写英文字母组成。
"aabcccccaaa"
"a2b1c5a3"
"welcometonowcoderrrrr"
"welcometonowcoderrrrr"
welcometonowcoderrrrr转换成重复字母压缩的结果是w1e1l1c1o1m1e1t1o1n1o1w1c1o1d1e1r5,比原字符串的长度还要长,所以返回原先的字符串。
import java.util.*;
public class Zipper {
public String zipString(String iniString) {
// write code here
int len = iniString.length();
if(len == 0){
return iniString;
}
List<Character> ch = new ArrayList<>();
List<Integer> in = new ArrayList<>();
int index = 0;
ch.add(index,iniString.charAt(index));
in.add(index,1);
index++;
for(int i = 1;i < iniString.length();i++){
char c = iniString.charAt(i);
if(ch.get(index - 1) == c){
in.set(index - 1,in.get(index - 1) + 1);
}else{
ch.add(index,c);
in.add(index,1);
index++;
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < index ;i++){
sb.append(ch.get(i));
sb.append(in.get(i));
}
return sb.toString().length() > iniString.length() ? iniString : sb.toString();
}
} import java.util.*;
public class Zipper {
public String zipString(String iniString) {
StringBuffer str = new StringBuffer();
int count = 0;
for(int i = 0;i < iniString.length();i++){
char s = iniString.charAt(i);
if(i == iniString.length() - 2){
char sn = iniString.charAt(i+1);
if(s == sn){
++count;
str.append(s).append(++count);
}else{
str.append(s).append(++count);
count=0;
str.append(sn).append(++count);
}
break;
}
if(s == iniString.charAt(i+1)){
count++;
}else{
str.append(s).append(++count);
count = 0;
}
}
if(str.length() < iniString.length()){
return str.toString();
}
return iniString;
}
}
求大神帮忙看看有没有可以优化的
import java.util.*;
import java.util.regex.*;
public class Zipper {
public String zipString(String iniString) {
// write code here
Pattern p = Pattern.compile("(.)\\1*");
Matcher m = p.matcher(iniString);
StringBuilder ret = new StringBuilder(iniString.length()*2);
while (m.find()) {
String t = m.group(0);
ret.append(t.charAt(0));
ret.append(t.length());
}
System.out.println(ret);
return iniString.length() <= ret.length() ? iniString : ret.toString();
}
} import java.util.*;
public class Zipper {
public String zipString(String iniString) {
// write code here
if(iniString == null || iniString.length()==0) return iniString;
StringBuilder builder = new StringBuilder("");
builder.append(iniString.charAt(0));
int count=1;
for(int i=1;i<iniString.length();i++){
if(iniString.charAt(i)==iniString.charAt(i-1)) count++;
else{
builder.append(count).append(iniString.charAt(i));
count=1;
}
}
builder.append(count);
if(builder.toString().length()>=2*iniString.length()) return iniString;
return builder.toString();
}
} import java.util.*;
public class Zipper {
public String zipString(String iniString) {
String a = iniString;
StringBuffer result = new StringBuffer();
int count = 1;
for (int i = 0; i < a.length() - 1; i++) {
if (a.charAt(i) == a.charAt(i + 1)) {
count++;
continue;
}
result.append(a.charAt(i)).append(count);
count = 1;
}
result.append(a.charAt(a.length() - 1)).append(count);
String bbb = result + "";
if(bbb.length() >= a.length()){
return a;
}else{
return bbb;
}
}
}
import java.util.*;
public class Zipper {
public String zipString(String s) {
if(s==null||s.trim().isEmpty()) return "";
// write code here
StringBuilder sb =new StringBuilder();
char[]p = s.toCharArray();
char pre = p[0];
int count = 1;
for(int i=1;i<p.length;++i) {
char cur = p[i];
if(pre==cur) {
++count;
}else{
sb.append(pre).append(count);
pre = cur;
count = 1;
}
}
sb.append(pre).append(count);
String calc = sb.toString();
if(calc.length()>=p.length) return s;
return calc;
}
} import java.util.*;
public class Zipper {
public String zipString(String iniString) {
int count = 1;
String resultString = "";
for (int i = 0; i < iniString.length()-1; i++) {
if (iniString.charAt(i) == iniString.charAt(i+1)) {
count++;
// 不越界前提下统计最后一组字符
if (i == iniString.length()-2) resultString += iniString.charAt(i) + String.valueOf(count);
} else {
resultString += iniString.charAt(i) + String.valueOf(count);
// 重置count
count = 1;
}
}
if (resultString.length() > iniString.length()) return iniString;
else return resultString;
}
} // 解法一
import java.util.*;
public class Zipper {
public String zipString(String iniString) {
StringBuilder sb = new StringBuilder();
int cnt = 1;
char last = iniString.charAt(0);
for (int i = 1; i < iniString.length(); i++) {
if (iniString.charAt(i) == last) {
cnt++;
} else {
sb.append(last);
sb.append(cnt);
cnt = 1;
last = iniString.charAt(i);
}
}
sb.append(last);
sb.append(cnt);
return sb.length() >= iniString.length() ? iniString : sb.toString();
}
}
// 解法二
import java.util.*;
public class Zipper {
public String zipString(String iniString) {
int size = changeSize(iniString);
if (size >= iniString.length()) {
return iniString;
}
char[] res = new char[size];
int index = 0;
int cnt = 1;
char last = iniString.charAt(0);
for (int i = 1; i < iniString.length(); i++) {
if (iniString.charAt(i) == last) {
cnt++;
} else {
index = setChar(res, last, index, cnt);
cnt = 1;
last = iniString.charAt(i);
}
}
setChar(res, last, index, cnt);
return new String(res);
}
public int setChar(char[] res, char ch, int index, int cnt) {
res[index++] = ch;
char[] num = String.valueOf(cnt).toCharArray();
for (char n : num) {
res[index++] = n;
}
return index;
}
public int changeSize(String iniString) {
int cnt = 1;
int size = 0;
char last = iniString.charAt(0);
for (int i = 1; i < iniString.length(); i++) {
if (iniString.charAt(i) == last) {
cnt++;
} else {
size += 1 + String.valueOf(cnt).length();
cnt = 1;
last = iniString.charAt(i);
}
}
size += 1 + String.valueOf(cnt).length();
return size;
}
} import java.util.*;
/**
标签
*/
/*//这种只适合前面出现后面不出现的字符串
public class Zipper {
public String zipString(String iniString) {
// write code here
if(iniString.length()<=2)return iniString;
StringBuffer sb = new StringBuffer();
int sIndex = 0;
int n = iniString.length();
while(sIndex < n){
char ch = iniString.charAt(sIndex);
int eIndex = iniString.lastIndexOf(ch);
if(sIndex==eIndex){
sb.append(ch);
sIndex++;
}else{
sb.append(ch);
sb.append(eIndex-sIndex + 1);
sIndex = eIndex+1;
}
}
if(n<=sb.length())
return iniString;
else
return sb.toString();
}
}*/
public class Zipper {
public String zipString(String iniString) {
// write code here
if(iniString.length()<=2)return iniString;
StringBuffer sb = new StringBuffer();
int sIndex = 0;
int n = iniString.length();
while(sIndex < n){
char ch = iniString.charAt(sIndex);
int temp = 0;
while(sIndex < n && ch==iniString.charAt(sIndex)){
temp++;
sIndex++;
}
sb.append(ch);
sb.append(temp);
}
if(n<=sb.length())
return iniString;
else
return sb.toString();
}
} import java.util.*;
public class Zipper {
public String zipString(String iniString) {
// write code here
char[] chars = iniString.toCharArray();
int size = iniString.length();
char[] temp = new char[10000];
int k = 0;
int i = 0;
int leng=0;
while(i<size) {
int isize = 1;
for(int j=i+1; j< size; j++) {
if(chars[i] == chars[j]) {
isize++;
}else {
temp[k++] = chars[i];
String te = String.valueOf(isize);
char[] ints = te.toCharArray();
for(int d=0;d<te.length();d++) {
temp[k++] = ints[d];
}
leng = leng + 1 + te.length();
break;
}
if(j == size-1) {
temp[k++] = chars[i];
String te = String.valueOf(isize);
char[] ints = te.toCharArray();
for(int d=0;d<te.length();d++) {
temp[k++] = ints[d];
}
leng = leng + 1 + te.length();
}
}
i = i + isize;
}
char[] mm = new char[leng];
for(int m=0;m<leng;m++) {
mm[m] = temp[m];
}
if(leng >= chars.length) {
return new String(chars);
}
return new String(mm);
}
} import java.util.*;
public class Zipper {
public String zipString(String iniString) {
int flag=1;
StringBuffer sb =new StringBuffer();
sb.append(iniString.charAt(0));
for(int i=0;i<iniString.length()-1;i++){
if(iniString.charAt(i+1)==iniString.charAt(i)){
flag++;
}
else{
sb.append(flag);
sb.append(iniString.charAt(i+1));
flag=1;
}
}
sb.append(flag);
if (sb.length()>=iniString.length())
{
return iniString;
}
else
{
return sb.toString();
}
// write code here
}
} /*直接新建一个小的数组,一旦数组越界则证明比等于或大于原数组,则返回原数组,
本机编译可以,但是这里报错了,有点晕
*/
try{
char[] strs=iniString.toCharArray(); char[] newStr=new char[strs.length-1]; int j=1;
newStr[j++]=strs[0];
newStr[j]='1'; for(int i=1;ilength;i++){ if(strs[i]==strs[i-1]){ if(newStr[j]=='9'){
newStr[j++]='1';
newStr[j]='0';
}else{
newStr[j]+=1;
}
}else{
j++;
newStr[j]=strs[i];
j++;
newStr[j]='1';
}
} return String.valueOf(newStr);
}catch(java.lang.ArrayIndexOutOfBoundsException e){ return iniString;
} //思路用栈来实现每个字符和前一个字符的比较,看是否相同。
import java.util.*;
public class Zipper {
public static void main(String[] args) {
System.out.println(zipString("dfsbfakfannfeer"));
}
public static String zipString(String iniString) {
Stack<Character> stack = new Stack<Character>();
char[] chs = iniString.toCharArray();
String returnStr = "";
int num = 1; //记录字符连续出现次数
boolean flg = true;
stack.push(chs[0]); //压入第一个字符
for (int i = 1; i < chs.length; i++) {
if (chs[i] == top(stack)) {
num++;
//当最后一个字符为连续字符
if(i == chs.length - 1){
returnStr += (new Character(chs[i-1])).toString();
returnStr += (new Integer(num)).toString();
}
} else {
//当最后一个字符为不连续字符
if(i == chs.length - 1){
returnStr += (new Character(chs[i])).toString();
returnStr += (new Integer(1)).toString();
}
returnStr += (new Character(chs[i-1])).toString();
returnStr += (new Integer(num)).toString();
num = 1;
stack.push(chs[i]);
}
}
//排除压缩后字符串没有变短的情况,即不出现连续字符
if(iniString.length() * 2 == returnStr.length()){
return iniString;
}
return returnStr;
}
//自定义取栈顶方法
public static char top(Stack<Character> stack){
if(!stack.empty()){
char ch = stack.pop();
stack.push(ch);
return ch;
}
return '0';
}
}
import java.util.*; public class Zipper { public String zipString(String iniString) { // write code here if(iniString==null||iniString.trim().length()==0){ return ""; } StringBuilder strB = new StringBuilder(""); char[] iniStr = iniString.toCharArray(); char pre; pre = iniStr[0]; int count = 1; for(int i = 1;i < iniStr.length; i++){ if(pre == iniStr[i]){ count++; }else{ strB.append(pre+""+count); pre = iniStr[i]; count = 1; } } strB.append(pre+""+count); if(strB.toString().length() >= iniString.length()){ return iniString; } return strB.toString(); } }