环绕字符串的唯一子字符串

时间:2016-12-04 04:44:00

标签: string algorithm

我已经给了字符串 str =“abcdefghijklmnopqrstuvwxyz”的无限回绕,所以它看起来像 “.. zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd ....”和另一个字符串 p

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

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

        }

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

一旦我得到一个后缀,这是上面的一部分,我将所有的子串添加到我的结果中,如:

var triggerAtTime = 10;
var attackTime = 3;
var sustainTime = 5;
var releaseTime = 5;

var attackVol = 0.8;

var attackStartTime = triggerAtTime;
var attackEndTime = triggerAtTime + attackTime;

var releaseStartTime = attackEndTime + sustainTime;
var releaseEndTime = releaseStartTime + releaseTime;

var gainNode = ctx.createGain();
var gng = gainNode.gain;

gng.setValueAtTime(0, attackStartTime);
gng.linearRampToValueAtTime(attackVol, attackEndTime);

gng.setValueAtTime(attackVol, releaseStartTime);
gng.linearRampToValueAtTime(0, releaseEndTime);

sourceNode.connect(gainNode);

我的isPresent功能是:

function pMath1 () {  

  if ( m10() == false && m5() == false && last !== test) {

    return "Lesson " + lesson; // code execution stops here as return called
    lesson++; // lesson value is not gonna increment
    last = "lesson"; // neither last value will update

  } else if ( m10() == false && m5() == true) {

    return "Test " + test; // again, code execution stops here
    test++; // test value will not increment
    last = "test"; // neither this will be executed

  } else if ( m10() == true ) {

    return "Inv " + inv; // and here is our inv variable, it was 8, we are returning 8, not giving chance inv to increase as stated line below 
    inv++;
    last = "inv";

  } else {
    console.log("pMath1 doesn't work");
  }
}

如果p的长度大于isPresent函数中假设的假定连接字符串,则我的算法失败!!

那么我应该如何找到子字符串而不管字符串 str ?这个问题有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

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

  1. 你不需要考虑环绕字符串的无限重复,而只需考虑len(p)/len(repeating-fragment) + 1(整数除法)重复。我们用S **
  2. 表示这个字符串
  3. 如果sp的子字符串pS的子字符串,则sp的任何子字符串都是S的子字符串
  4. 所以问题似乎减少为:

    • 以最大长度查找sppS的子字符串)。这被称为longest common substring并且允许动态编程解决方案,其复杂度为O(n*m)(两个字符串的长度)。引用的是伪代码算法。
    • 在删除最长公共子字符串后,以p的'残余'递归重复上述内容。

    现在,您有一系列“最长公共子串”。你需要保留多少?我觉得“最长的常见子串”可以用来减少强制执行任何和所有上述的每个子串的需要,但我需要比现在更多的时间。

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

    ** 我可能错误的重复次数需要考虑。如果我是,那么在任何情况下都会有最大数量的重复被考虑,并且最小长度S就足够了。