5 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
可以使用反向引用通過正則表達(dá)式魔術(shù)來完成。
String in = "aaaaddbbbbc";
int n = 2;
String pattern = String.format("(([a-z])\\2{%d})\\2+", n - 1);
System.out.println(in.replaceAll(pattern, "$1"));
輸出:
ddbbc
解釋:里面的數(shù)字{}是n-1。
([a-z])是一個(gè)捕獲組,匹配從 a 到 z 的任何單個(gè)小寫字母。由于它是表達(dá)式中的第二組括號,因此可以引用為2.
(([a-z])\\2{n})意思是“匹配相同字母的 n+1 次重復(fù)”。它構(gòu)成了第一個(gè)捕獲組,我們將使用它作為替換
\\2+匹配同一字母的所有額外重復(fù)。它們在更換后被丟棄。

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
看看這個(gè)解決方案。您應(yīng)該注意輸入字符串中的最后一個(gè)字符,因?yàn)槟坏阶詈笠粋€(gè)字符。
private void replaceConsecutiveDuplicates() {
String input = "aaadbbb";
int n = 2;
StringBuffer sb = new StringBuffer();
int count = 1;
char current;
for( int i = 0; i < input.length(); ++i){
current = input.charAt(i);
if (i + 1 < input.length() && current == input.charAt(i + 1)) {
++count;
} else if (count > 1) {
for(int j = 0; j < n; ++j) {
sb.append(current);
}
count = 1;
}
else {
sb.append(current);
}
}
System.out.println(sb.toString());
}

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
要再添加一個(gè)備選方案:
String in = "aaadbbbjjkllllllopp";
int n = 2;
StringBuilder sb = new StringBuilder();
char temp = in.charAt(0);
for(int i = 0; i < in.length()-1;){ // note that the incrementation of i is moved to the while loop
temp = in.charAt(i); // save current char in temp variable
int count = 0;
while (i < in.length() && in.charAt(i) == temp) { ///iterate as long as you find same chars or hit the end of the string
i++;
count++;
}
if (count > n){ // if and only if count is greater than max allowed set it to max allowed
count = n;
}
for(int j = 0; j < count; j++){ // append count chars
sb.append(temp);
}
}
System.out.println(sb.toString());

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
public static String test(String input, int repetitions) {
String flag = "";
String replacement = "";
String output = input;
ArrayList<Character> prevLetters = new ArrayList<Character>();
for(int x = 0; x < input.length(); x++) {
if(!prevLetters.contains(input.charAt(x))) {
for(int y = 0; y <= repetitions ; y++) {
flag += String.valueOf(input.charAt(x));
}
if(input.contains(flag)) {
replacement = flag.substring(0, flag.length()-1);
while(output.contains(flag)){
output = output.replace(flag, replacement);
}
}
flag = "";
prevLetters.add(input.charAt(x));
}
}
return output;
}
這是我的解決方案,它遵循與您類似的想法。然而,與其比較每個(gè)字符值,我認(rèn)為簡單地檢查規(guī)則中的中斷(字符連續(xù)出現(xiàn) n+1 次)并“修復(fù)”它會更容易。
如果您有興趣使用您的方法,我注意到的一個(gè)潛在問題是您沒有在最后一個(gè) else 中將計(jì)數(shù)分配給 1。您也沒有機(jī)會添加最后一個(gè)字符,因?yàn)槟辉谘h(huán)持續(xù)時(shí)間為 len - 1 時(shí)在索引“i”處添加字符。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
我認(rèn)為你在正確的軌道上。我不確定這是否是一項(xiàng)作業(yè),所以我不想直接給你答案,但這里有一些可能有用的提示:
您已經(jīng)在遍歷字符串。這很棒!但是,我認(rèn)為您想將當(dāng)前字符與前一個(gè)字符進(jìn)行比較,而不是下一個(gè)字符。
您不需要將輸入轉(zhuǎn)換為 char 數(shù)組來迭代它,只需使用
charAt(idx)
您似乎從不使用 prev,但我認(rèn)為您在聲明時(shí)心中有正確的想法!
將您的問題分為兩部分:何時(shí)更新計(jì)數(shù)和何時(shí)附加字符。您可以在 for 循環(huán)中解決這兩個(gè)問題,但不要嘗試在同一個(gè) if 語句中同時(shí)執(zhí)行這兩個(gè)操作,而是將其分解為多個(gè) if。
要做的三件事是:
更新上一個(gè)值
更新計(jì)數(shù)
更新新字符串
獲得這些的正確順序以及我將留給你的確切實(shí)現(xiàn)(再次,因?yàn)槲也淮_定這是否是一項(xiàng)任務(wù))
更新:由于其他人發(fā)布,這是我的解決方案(使用單個(gè) for 循環(huán)):
private String replaceConsecutiveDuplicates(String input, int n) {
if (input == null || input.length() < n) return input;
if (n == 0) return "";
StringBuffer sb = new StringBuffer();
int count = 1;
char prev = input.charAt(0);
sb.append(prev);
char current;
for( int i = 1; i < input.length(); i++) {
current = input.charAt(i);
if (prev == current) {
if (++count > n) continue;
} else {
count = 1;
}
prev = current;
sb.append(current);
}
return sb.toString();
}
添加回答
舉報(bào)