我已经给了字符串 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 ?这个问题有更好的方法吗?
答案 0 :(得分:0)
一些想法/建议(不是一个完整的算法)
len(p)/len(repeating-fragment) + 1
(整数除法)重复。我们用S
** sp
的子字符串p
是S
的子字符串,则sp
的任何子字符串都是S
的子字符串所以问题似乎减少为:
sp
(p
和S
的子字符串)。这被称为longest common substring并且允许动态编程解决方案,其复杂度为O(n*m)
(两个字符串的长度)。引用的是伪代码算法。p
的'残余'递归重复上述内容。现在,您有一系列“最长公共子串”。你需要保留多少?我觉得“最长的常见子串”可以用来减少强制执行任何和所有上述的每个子串的需要,但我需要比现在更多的时间。
我希望上面的草图有所帮助。
** 我可能错误的重复次数需要考虑。如果我是,那么在任何情况下都会有最大数量的重复被考虑,并且最小长度S
就足够了。