从Java中的字符串中删除相邻的重复项

时间:2017-09-24 14:36:52

标签: java algorithm duplicates

假设我输入的字符串为“aaabbaccd”。我需要设计一个程序,从我的输出中删除所有相邻的重复项。以上面的字符串为例,输出结果如下: 1.删​​除相邻重复项后我得到的第一个输出是“aad”(从我的输入中删除了aabbcc)。 2.在第二遍中,它将从我的字符串中删除aa并将输出设为“d”。

到目前为止,我可以设计以下代码:

String input="aaabbaccd";

    String[] arr=input.split("");

    int n=arr.length;
    for(int i=0;i<n;i++) {
        if(i==arr.length-1) {
            if(arr[i-1].equals(arr[i])) {
                break;
            }
            else {
                System.out.print(arr[i]+ "");
                break;
            }
        }
        if(arr[i].equals(arr[i+1])) {
            i=i+1;
            continue;
        }
        if(!arr[i].equals(arr[i+1])) {
            System.out.print(arr[i]+ "");
        }
    }

此代码的问题在于它将输出作为aad。我无法理解如何对我的代码进行第二次传递。也许递归是我需要在这段代码中实现的东西。请帮我看看如何在这段代码中实现递归。

4 个答案:

答案 0 :(得分:0)

一个懒惰的替代方法是使用regexp,其中@csrf_exempt def rq_create_account_json(request): if request.is_ajax(): if request.method == 'POST': json_data = json.loads(request.body) print(json_data) return JsonResponse(json_data) return HttpResponse("Error") 部分匹配任何字符并保存它,(.)引用返回该匹配。我添加了递归以继续应用删除,直到字符串不再被修改:

\\1

行为已通过以下方式验证:

public String removeDuplicates(String original)
{
    String reduced = original.replaceAll("(.)\\1", "");

    if(reduced.equals(original))
        // No more duplicates, return original string
        return original;
    else
        // Duplicates were removed, continue recursion...
        return removeDuplicates(reduced);
}

答案 1 :(得分:0)

public static void main(String[] args) {
        String input="aaabbaccd";
        removeDupe(input);


    }

    public static void removeDupe(String input) {
        String[] arr=input.split("");

        StringBuffer sb=new StringBuffer();
        int n=arr.length;
        for(int i=0;i<n;i++) {
            if(i==arr.length-1) {
                if(arr.length==1) {
                    sb.append(arr[i]);
                    break;
                }
                if(arr[i-1].equals(arr[i])) {
                    break;
                }
                else {
                    sb.append(arr[i]);
                    break;
                }
            }
            if(arr[i].equals(arr[i+1])) {
                i=i+1;
                continue;
            }
            if(!arr[i].equals(arr[i+1])) {
                sb.append(arr[i]);
            }
        }

        //System.out.println(sb);

        if(sb.toString().equals(input)) {
            System.out.println(sb);
        }
        else {
            removeDupe(sb.toString());
        }


    }

答案 2 :(得分:0)

以下一个班轮怎么样?

(new LinkedHashSet<Character>("aaabbaccd".chars().mapToObj(i -> (char)i).collect(Collectors.toList()))).stream().map(e -> e.toString()).collect(Collectors.joining());

答案 3 :(得分:0)

我使用StringBuilder类来存储字符串,并使用StringBuilder的replace()方法来删除Adjacent char。

此声明:str.replace(i,i+2,"")实际上 删除 相邻的字符。

核心逻辑是用名为remove()的静态方法编写的。注意我不止一次调用remove()方法,即str.length()/ 2次。因为要删除每次调用remove()后我们得到的新字符串中的相邻对。

public class RemoveDupl12{           
 public static StringBuilder remove(StringBuilder  str){    

   for( int i=0; i<str.length()-1; i++ )

    {
        if(str.charAt(i)==str.charAt(i+1))
        { 
            str.replace(i,i+2,"");
            i++;
        }
    }
    return str;
}

public static void main(String[] args) {
     StringBuilder str=new StringBuilder("daaabbad");

     for(int i=str.length()/2;i>0;i--)
     str=remove(str);

     if(str.length()==0)
         System.out.println("Final output=empty string"+str);

     else
         System.out.println("Final output="+str);
}}