java - 用不允许出现的次数替换字符串中的所有连续重复项

标签 java string algorithm

<分区>

我需要编写一个方法,将字符串作为参数并返回一个新字符串,该字符串是通过用该字符串的 'n' 实例替换重复的相邻字母的每个实例而获得的。

例如,如果 "aaabcccd" 作为输入字符串且 n =2,则返回 "aabccd"。我已经尝试了以下代码,但没有得到预期的输出

String in = "aaadbbb";
char[] s = in.toCharArray();
int len = s.length;

int n = 2;
StringBuffer new_s = new StringBuffer("");
int count = 1;
char prev='\0';

for (int i = 0; i < len - 1; i++) {
    if (s[i] == s[i + 1]) {
       if(count <= n){
            new_s.append(s[i]);
           count++;
        }else{
         count=1;
       }
    } else {
        new_s.append(s[i]);
    }
}
   
System.out.println(new_s);

输出-aaadb 预期-aadbb

最佳答案

可以通过使用反向引用的正则表达式魔术来完成。

String in = "aaaaddbbbbc";
int n = 2;
String pattern = String.format("(([a-z])\\2{%d})\\2+", n - 1);
System.out.println(in.replaceAll(pattern, "$1"));

输出:

aaddbbc

解释: {} 中的数字是 n-1

([a-z]) 是一个捕获组,匹配从 a 到 z 的任何单个小写字母。由于它是表达式中的第二组括号,因此可以引用为 2

(([a-z])\\2{n}) 表示“匹配相同字母的 n+1 次重复”。它构成了第一个捕获组,我们将使用它作为替换

\\2+ 匹配同一字母的所有额外重复。它们在更换后被丢弃。

关于java - 用不允许出现的次数替换字符串中的所有连续重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57058663/

相关文章:

c++ - templated operator string() 在临时对象时不会编译

python - 提高性能 : Remove all strings in a (big) list appearing only once

java - KafkaAvroDeserializer-NoClassDefFoundError : io/confluent/common/config/ConfigException

java - 首次在 Google AppEngine Standard 项目上运行 gradle 时出现 NullPointerException

java - 从 1.4.2 升级后,Spring Boot 1.4.3+ 中的 LoadTimeWeaving 不起作用

java - 如何在 Sencha GXT 中实现颜色选择器字段?

c# - TryParseExact 返回 false,虽然我不知道为什么

python - 从列表中的一个字符串中搜索任何单词或单词组合(python)

performance - 算法性能的实际引用?

algorithm - 构造函数参数还是方法参数?