【问题标题】:Unique Substrings in wrap around strings环绕字符串中的唯一子字符串
【发布时间】:2017-04-18 17:41:45
【问题描述】:

我得到了字符串 str="abcdefghijklmnopqrstuvwxyz" 的无限环绕,所以它看起来像 "..zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd...." 和另一个字符串 p.

我需要找出 在无限环绕字符串 str 中存在多少个 p 的唯一非空子字符串?

For example: "zab"
There are 6 substrings "z", "a", "b", "za", "ab", "zab" of string "zab" in str.

我尝试在字符串 str 的特定串联中查找 p 的所有后缀,例如:"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"

一旦我得到一个作为上述一部分的后缀,我就会将它的所有子字符串添加到我的结果中,如下所示:

         for (int i=0;i<length;i++) {
             String suffix = p.substring(i,length);
             if(isPresent(suffix)) {
                 sum += (suffix.length()*(suffix.length()+1))/2;
                 break;
             } else {
                 sum++;
             }
         }

而我的 isPresent 函数是:

     private boolean isPresent(String s) {
            if(s.length()==1) {
                return true;
            }
            String main = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde
fghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
            return main.contains(s);

        }

如果 p 的长度大于我在 isPresent 函数中假设的串联字符串,我的算法将失败!!

那么我应该如何找到子字符串而不考虑环绕字符串str?有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: string algorithm


    【解决方案1】:

    一些想法/建议(不是完整的算法)

    1. 您不需要考虑环绕字符串的无限重复,而只需考虑len(p)/len(repeating-fragment) + 1(整数除法)重复。让我们用S ** 来表示这个字符串
    2. 如果p 的子字符串spS 的子字符串,则sp 的任何子字符串都将是S 的子字符串

    所以问题似乎归结为:

    • 找到最大长度的sppS 的子字符串)。这称为longest common substring 并承认具有O(n*m) 复杂性的动态编程解决方案(两个字符串的长度)。被引用的有一个伪代码算法。
    • 在消除最长的公共子串后,用p 的“残余”递归重复上述操作。

    现在,您有一个“最长公共子字符串”序列。你需要保留多少?我觉得“最长的公共子字符串”可用于减少对上述任何内容的每个子字符串进行暴力破解的需要,但我需要的时间比我现在可用的时间要多。

    我希望上面的草图有所帮助。


    ** 我可能对需要考虑的重复次数有误。如果我是,那么在任何情况下都将考虑最大重复次数,并且将有一个最小长度的S 足以达到目的。

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2021-08-29
      相关资源
      最近更新 更多