var findSubstringInWraproundString = function(p) {
var b = {};
var findZ = 0;
for(var i=0;i<p.length;i++){
// b[p.substring(i,i)]=1;
findZ = 0;
for(var j=i;j<p.length;j++){
// console.log(i+' ,'+j+': '+(p[j].charCodeAt())-(p[i].charCodeAt()))
/*if((p[j].charCodeAt())-(p[i].charCodeAt())==(j-i)){
b[p.substring(i,j+1)]=1;
// continue;
}else */if(/*findZ && */(p[j].charCodeAt())-(p[i].charCodeAt())==(j-i)-26*findZ){
b[p.substring(i,j+1)]?b[p.substring(i,j+1)]++:b[p.substring(i,j+1)]=1;
// continue;
}else{
findZ = 0;
break;
}
if(p.charAt(j)=="z"){
findZ ++;
}
}
}
return Object.keys(b).length;
// for(var key in b){
// console.log(b[key]+" : "+key);
// }
};
程序运行的结果是正确的。且可以实现,查找子串出现的次数。但是,时间太长,提交的时候,最后一个黑盒超出时间,出错。
若干个坑:
p.substring(i,j): i,j一致,返回为”。这会导致很多单个字母不能出现。
方法二:
aaa=function(p){
var start = 0;
var sbstring = {}
p=p+'0';
var isConti = false;
var b;
for(var i=0;i<p.length-1;i++){
b = p[i+1].charCodeAt() - p[i].charCodeAt();
sbstring[p.substring(i,i+1)] ?sbstring[p.substring(i,i+1)]++:sbstring[p.substring(i,i+1)]=1;
if(b==1 || b== -25){
if(!isConti){
isConti = true;
start = i;
(sbstring[p.substring(start,i+2)]) ?sbstring[p.substring(start,i+2)]++:sbstring[p.substring(start,i+2)]=1;
}else{
(sbstring[p.substring(start,i+2)]) ?sbstring[p.substring(start,i+2)]++:sbstring[p.substring(start,i+2)]=1;
//i = start;
}
}else{
if(isConti){
i = start;
}
isConti = false;
// i = start ;
}
}
for(var key in sbstring){
console.log(sbstring[key]+" :"+key);
}
}
该方法看似简单许多,但其实复杂度仍然是O(n2)。因为涉及到了求出所有子串。就本题而言,其只要求出个数的话,完全可以累积”连片字母”长度的阶乘和,计算出结果。可以简化问题的难度。