从字符串中删除重复的单词

问题描述 投票:0回答:3

我有一个字符串:

你好,你怎么样?

我喜欢饼干饼干,苹果和煎饼煎饼。

我希望输出:

你好,你好吗?

我喜欢饼干,苹果和煎饼。

直到现在我已编码:

String[] s = input.split(" ");
String prev = s[0];
String ans = prev + " ";

for (int i = 1; i < s.length; i++) {

    if (!prev.equals(s[i])) {
        prev = s[i];
        ans += prev + " ";
    }
}

System.out.println(ans);

我得到的输出为:

你好,你好吗?

我喜欢饼干饼干,苹果和煎饼煎饼。

我需要一些帮助, . ! ? .的逻辑..

java string algorithm
3个回答
4
投票

你可以使用regex为你做这件事。示例代码:

String regex = "\\b(\\w+)\\b\\s*(?=.*\\b\\1\\b)";
input = input.replaceAll(regex,"");
  1. \b匹配单词字符和非单词字符或位置(字符串的开头/结尾)之间的单词边界位置。
  2. qazxsw poi匹配任何单词字符(字母数字和下划线)。
  3. \w匹配单词字符和非单词字符或位置(字符串的开头/结尾)之间的单词边界位置。
  4. \b匹配任何空格字符(空格,制表符,换行符)。
  5. \s匹配*或更多前面的标记。
  6. 0在主表达式之后匹配一个组,而不在结果中包含它。
  7. (?=匹配除换行符之外的任何字符。
  8. .匹配步骤2中捕获组#1的结果。

注意:在此处使用单词边界以避免匹配部分单词非常重要。

这里是正则表达式演示和解释的链接:\1


2
投票

您可以使用RegexDemo来标记单词。确保设置分隔符以分割单词。在你的情况下,他们是空格,逗号和句号。这可以帮助您分割没有标点符号的单词。然后,您可以将先前的标记与当前标记进行比较,如果它们相等,则可以忽略它。

您可以尝试以下代码段:

java.util.StringTokenizer

2
投票

您应该使用辅助变量来存储您的单词而不使用标点符号。

String s = "I love cookies cookies, apples and pancakes pancakes.";

StringTokenizer tokenizer = new StringTokenizer(s, " ,.", true);

List<String> duplicateRemovedTokenList = new LinkedList<>();

String prevToken = null;

while (tokenizer.hasMoreTokens()) {

    String currentToken = tokenizer.nextToken();

    if (currentToken.equals(" ")) {
        duplicateRemovedTokenList.add(currentToken);
        continue;
    }

    if (!currentToken.equals(prevToken)) {
        duplicateRemovedTokenList.add(currentToken);
        prevToken = currentToken;
    }
}

String duplicateRemovedString = StringUtils.join(duplicateRemovedTokenList, "");
© www.soinside.com 2019 - 2024. All rights reserved.