删除重复的短语[关闭]

Posted

技术标签:

【中文标题】删除重复的短语[关闭]【英文标题】:Remove duplicate phrases [closed] 【发布时间】:2022-01-06 05:18:04 【问题描述】:

如何删除重复的短语?我想从 2 个字符串中生成名称,但没有重复的短语。

条件:

    不要从同一字符串中删除重复项。我的意思是:
String s1 = "duplicate duplicate duplicate"
String s2 = "xyz"
afterRemovedDuplicates = "duplicate duplicate duplicate xyz"

    仅当短语一个接一个出现时删除短语
String s1 = "duplicate phrases"
String s2 = "duplicate phrases abcd"
afterRemovedDuplicates = "duplicate phrases abcd"

但它也可以是短语的一部分(仅当短语一个接一个出现时)

String s1 = "duplicate phrases"
String s2 = "phrases abcd"
afterRemovedDuplicates = "duplicate phrases abcd"

如果我们有

String s1 = "duplicate phrases x"
String s2 = "duplicate phrases abcd"
afterRemovedDuplicates = "duplicate phrases x duplicate phrases abcd"

删除重复项不应执行任何操作,因为“x”位于短语之间。

【问题讨论】:

您在尝试解决此问题时遇到了什么问题? 我尝试使用正则表达式,但这也会从同一字符串中删除短语。我不能简单地拆分字符串,因为它不能表达一个单词。 【参考方案1】:

试试这个。

static String removeDuplicatePhrase(String s1, String s2) 
    s1 = s1.trim(); s2 = s2.trim();
    List<String> list1 = List.of(s1.split("\\s+"));
    List<String> list2 = List.of(s2.split("\\s+"));
    int size1 = list1.size(), size2 = list2.size();
    int i = Math.min(size1, size2);
    for (; i > 0; --i)
        if (list1.subList(size1 - i, size1).equals(list2.subList(0, i)))
            break;
    return String.join(" ", list1) + " " + String.join(" ", list2.subList(i, size2));


static void test(String s1, String s2) 
    System.out.println("s1     = " + s1);
    System.out.println("s2     = " + s2);
    System.out.println("result = " + removeDuplicatePhrase(s1, s2));
    System.out.println();


public static void main(String[] args) 
    test("duplicate duplicate duplicate", "xyz");
    test("duplicate phrases", "duplicate phrases abcd");
    test("duplicate phrases", "phrases abcd");
    test("duplicate phrases x", "duplicate phrases abcd");
    test("duplicate phrases", "duplicate phrases");
    test("duplicate ph", "duplicate phrases");
    test("duplicate phrases", "phrases");
    test("duplicate phrases", "rases");

输出:

s1     = duplicate duplicate duplicate
s2     = xyz
result = duplicate duplicate duplicate xyz

s1     = duplicate phrases
s2     = duplicate phrases abcd
result = duplicate phrases abcd

s1     = duplicate phrases
s2     = phrases abcd
result = duplicate phrases abcd

s1     = duplicate phrases x
s2     = duplicate phrases abcd
result = duplicate phrases x duplicate phrases abcd

s1     = duplicate phrases
s2     = duplicate phrases
result = duplicate phrases 

s1     = duplicate ph
s2     = duplicate phrases
result = duplicate ph duplicate phrases

s1     = duplicate phrases
s2     = phrases
result = duplicate phrases 

s1     = duplicate phrases
s2     = rases
result = duplicate phrases rases

【讨论】:

它不能完全按照我的意愿工作,但我会尝试改变它。测试(“重复的ph”,“重复的短语”);预期结果:重复 ph 重复短语,但是是:重复短语 @Adams 我更新了我的答案。【参考方案2】:

从索引为零开始,您可以检查 s1 中索引处和之后的所有内容是否与 s2 的开头匹配,直到匹配或到达 s1 的结尾。然后,您可以在加入字符串时丢弃在 s1 中获得的索引处和之后的所有内容,因为 s2 已经从它开始。如果你的字符串很长,这个解决方案会很慢。

【讨论】:

以上是关于删除重复的短语[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

每个短语都以点结尾[关闭]

测量两个短语之间的语义相似性[关闭]

每 5 分钟删除重复项 [关闭]

关闭窗口期间删除文件[重复]

如何将字符串与包含空格的短语一起使用 [关闭]

如何从二维数组中删除重复项? [关闭]