【问题标题】:remove fragments in a sentence [puzzle]删除句子中的片段[拼图]
【发布时间】:2012-02-25 04:46:46
【问题描述】:

问题:

编写一个程序来删除出现在“所有”字符串中的片段,其中一个片段 是 3 个或更多连续单词。

示例:

输入::

s1 = "下雨了,我想开车回家。";

s2 = "下雨了,我想去滑雪。";

s3 = "天气很热,我想去游泳。";

输出::

s1 = "正在下雨开车回家。";

s2 = "下雨去滑雪吧。";

s3 = "天气很热,去游泳吧。";

移除片段 = "我想"

程序将再次测试大文件。 会考虑效率。

假设:忽略大小写、标点符号。但保留在输出中。

注意:注意

之类的情况

a a a a a b c b c b c b c 删除会产生更多碎片。

我的解决方案:(我认为这不是最有效的)

  1. 将三个单词短语散列到一个 int 中,并将它们存储在一个数组中,用于所有字符串。 减少到像

    这样的数字数组

    1 2 3 4 5
    3 5 7 9 8
    9 3 1 7 9

问题减少到数组的交集。

对数组进行排序。 (k * nlogn)

保留k个指针。如果找到所有相等的匹配项。否则递增指向最小值的指针。 解决上面的注释。我正在考虑做一个惰性删除,即标记要删除的短语并在末尾删除。

在某些情况下我的解决方案可能不起作用?我们可以优化我的解决方案/找到最佳解决方案吗?

【问题讨论】:

    标签: string algorithm hash


    【解决方案1】:

    第一个观察:用一个大字母表中的单个“字母”替换每个单词(即以某种方式散列世界),删除空格和标点符号。

    现在您已将问题简化为删除给定列表的所有个单词中出现的最长字母序列。 因此,您必须计算一组“单词”的最长公共子字符串。您可以使用generalized suffix tree 找到它,因为这是最有效的算法。这应该可以解决问题,而且我相信它具有最佳的复杂性。

    【讨论】:

    • 您建议如何将数千个不同的单词转换为小至 26 的范围?这会造成冲突,不是吗?
    • 哦不...我的想法当然是使用更大的字母表。没有人说它必须有 26 个字母。事实上,你需要有与单词一样多的字母。对于每个单词,您将其转换为小写,如果尚未满足该哈希值,则对其进行哈希处理,然后给它下一个自然数。
    • 好的。你强调字母吗?为什么数字不起作用?
    • 实际上我并不是说你需要使用实际的字母。我只是在使用与您看起来不同的术语。由于我们有有限数量的单词,因此我对它们进行编号,并将这些数字视为有限字母表中的字母。我使用这个解释,因为后缀树通常使用数字序列来处理单词和思想,我可能会让你感到困惑。似乎我确实让你感到困惑,但以这种方式......叹息
    【解决方案2】:

    第一步正如 izomorphius 已经建议的那样:

    用一个大字母表中的单个“字母”替换每个单词(即以某种方式散列世界),删除空格和标点符号。

    第二个你不需要知道最长的公共子字符串——你只想从所有字符串中删除它。 请注意,这相当于擦除所有长度正好为 3 的公共子串,因为如果您有更长的公共子串,那么它的长度为 3 的子串也是常见的。 为此,您可以使用哈希表(存储键值对)。

    只需遍历第一个字符串并将其所有 3 子字符串作为键值等于 1 的值放入哈希表中。 如果 x 在哈希表中并且其值为 1,则遍历第二个字符串和每个 3 子字符串 x,然后将值设置为 2。 然后遍历第三个字符串和每个 3 子字符串 x,如果 x 在哈希表中并且其值为 2,则将值设置为 3。 ...等等。 最后,具有 k 值的键是常见的 3 子字符串。

    现在只需再次遍历所有字符串并删除常见的 3 子字符串。

    【讨论】:

    • 如果一个句子的短语重复了两次而一个句子根本没有短语,您的解决方案将不起作用。在这种情况下,您的短语计数将是 k ,但并非所有句子都有该短语。 !你最终会删除错误的短语。
    • 而且,只是好奇。为什么数字不起作用?为什么要使用字母?
    • 字母,数字 - 相同的东西。对于您的其他评论-不,它会起作用-请注意,我说您仅在第 r 个字符串的值为 (r-1) 时才增加。因此,每个字符串的每个 3 子字符串只会增加一次。所以没关系。
    【解决方案3】:

    我的解决方案是这样的,

    F = all fragments with length > 3 shared by the first 2 lines, avoid overlaps
    for each line from the 3rd line and up
        remove fragments in F which do not exist in line, or cause overlaps
    
    return sentences with fragments in F removed
    

    我假设在句子中查找/匹配片段可以使用一些已知的算法来完成。但就 n 行的时间复杂度而言,这是 O(n)

    【讨论】:

      【解决方案4】:
      import java.io.*;
      import java.util.*;
      public class remove_unique{
          public static void main(String args[]){
              String s1 = "Everyday I do exercise if";
              String s2 = "Sometimes I do exercise if i feel stressed";
              String s3 = "Mostly I do exercise on morning";
              String[] words1=s1.split("\\s");
              String[] words2=s2.split("\\s");
              String[] words3=s3.split("\\s");
              StringBuilder sb = new StringBuilder();
              for(int i=0;i<words1.length;i++){
                  for(int j=0;j<words2.length;j++){
                      for(int k=0;k<words3.length;k++){
                          if(words1[i].equals(words2[j]) && words2[j].equals(words3[k]) 
                                  &&words3[k].equals(words1[i])){
                              //Concatenating the returned Strings
                              sb.append(words1[i]+" ");
                          }
                      }
                  }
              }
      
              System.out.println(s1.replaceAll(sb.toString(), ""));
              System.out.println(s2.replaceAll(sb.toString(), ""));
              System.out.println(s3.replaceAll(sb.toString(), ""));
          }
      }
      
      //LAKSHMI ARJUNA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-17
        • 2011-01-27
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多