Java 替换字符串中的所有连续重复项,但不允许出现

Java 替换字符串中的所有连续重复项,但不允许出现,java,string,algorithm,Java,String,Algorithm,我需要编写一个方法,该方法将字符串作为参数,并返回一个新字符串,该字符串是通过将重复的相邻字母的每个实例替换为该字符串的'n'实例而获得的 例如,如果“aaabcccd”作为输入字符串,并且n=2,则返回“aabccd”。我已经尝试了以下代码,但没有得到预期的输出 String in = "aaadbbb"; char[] s = in.toCharArray(); int len = s.length;

我需要编写一个方法,该方法将字符串作为参数,并返回一个新字符串,该字符串是通过将重复的相邻字母的每个实例替换为该字符串的
'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);

String in=“aaadbbb”;
char[]s=in.toCharArray();
int len=s.长度;
int n=2;
StringBuffer new_s=新的StringBuffer(“”);
整数计数=1;
char prev='\0';
对于(int i=0;i如果(count我认为你的思路是对的。我不确定这是否是一项作业,所以我不想直接给你一个答案,但这里有一些提示可能会有所帮助:

  • 您已经在对字符串进行迭代。这很好!但是,我认为您希望将当前字符与前一个字符进行比较,而不是下一个字符
  • 您不需要将输入转换为字符数组进行迭代,只需使用
    charAt(idx)
  • 您似乎从未使用过prev,但我认为您在声明它时的想法是正确的
  • 将问题分为两部分:何时更新计数和何时追加字符。您可以在for循环中处理这两个问题,但不要尝试在相同的if语句中同时处理这两个问题,而是将其分为多个if
  • 要做的三件事是:

    • 更新上一个值
    • 更新计数
    • 更新新字符串
    要获得这些的正确顺序和具体实现,我将留给您(同样,因为我不确定这是否是一项任务)

    更新:由于其他人发布,以下是我的解决方案(使用单for循环):

    私有字符串替换连续副本(字符串输入,int n){
    if(input==null | | input.length()n)继续;
    }否则{
    计数=1;
    }
    prev=当前值;
    某人(现任);
    }
    使某人返回字符串();
    }
    
    可以使用regexp-magic使用反向引用完成

    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+
    匹配同一字母的所有额外重复。它们在替换后被丢弃。

    公共静态字符串测试(字符串输入,int重复){
    
        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;
    }
    
    字符串标志=”; 字符串替换=”; 字符串输出=输入; ArrayList prevLetters=新的ArrayList(); 对于(int x=0;x对于(int y=0;y添加一个替代方案:

        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());
    
    String in=“aaadbbbjklllllllllpp”;
    int n=2;
    StringBuilder sb=新的StringBuilder();
    字符温度=英寸字符(0);
    对于(inti=0;in){//如果且仅当计数大于允许的最大值时,将其设置为允许的最大值
    计数=n;
    }
    对于(int j=0;j
    看看这个解决方案。您应该注意输入字符串中的最后一个字符,因为您只迭代到最后一个字符,而不是一个字符

    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());
    }
    
    private void replacementContinuedDuplicates(){
    字符串输入=“aaadbbb”;
    int n=2;
    StringBuffer sb=新的StringBuffer();
    整数计数=1;
    炭流;
    对于(int i=0;i1){
    对于(int j=0;j
    你能解释一下你的代码背后的逻辑吗?谢谢,Alex,但我想问你,只有一个for循环就足够了吗?是的,你可以在一个for循环中完成这项工作。“三件事”都发生在其中:)我已经用单循环解决方案更新了我的答案。非常有趣的方法。你能调整它以适应可变长度吗?当然。更新了答案以说明这一点。