- KMP模式匹配算法
思想:目标串 a 下标为 i 与模式串 b 下标为 j 自第一个字符开始比较,相等则,i、j 同时自增,如果不等则 b[j] = next[j] 。next数组是根据模式串 b 得出的,可以大致理解为,b[j]当前下标之前有多个前缀等于后缀。话不多说,上代码
// An highlighted block
(function speedOrder(){
let a = "abcadbacabcabcdab";
let b = "bcabcd";
console.log(mate(a,b))
/**
* 主串与模式串匹配
*/
function mate(objString,mateString){
/**
* 获取next()数组
*/
function getNext(orderString){
let next = [-1]
let k = -1
let j = 0
while(j < orderString.length-1){
if( k == -1 || orderString[j] == orderString[k]){
j++
k++
if(orderString[j] != orderString[k]){
next[j] = k
}else{
next[j] = next[k]
}
}else{
k = -1
}
}
return next
}
const next = getNext(b);
console.log(next)
let i = 0;
let j = 0;
while( i < objString.length && j < mateString.length ){
if( j==-1 || objString[i] == mateString[j] ){
i++;
j++;
}else{
j=next[j];
}
}
if(j==mateString.length){
return true
}
return false
}
})()
对于KMP而言最重要的就是理解next数组,我暂时只能理解未优化的next数组,代码中是优化后的,所以我在此就不多做解释。
- 两个随机数组取最大的三个数的和比大小
思想:先对随机数组排序,升序取后三位,降序取前三位相加。代码如下
function zjh(size){
//指定随机数个数
let a = [];
let b = [];
for(let i = 0 ; i < size ; i++){
a.push(parseInt(Math.random()*10));
b.push(parseInt(Math.random()*10));
}
console.log(a)
console.log(b)
a.sort(); //排序方法,升序
b.sort();
console.log(a)
console.log(b)
let person1=add(a[size-1],a[size-2],a[size-3]);
let person2=add(b[size-1],b[size-2],b[size-3]);
if(person1>=person2){
console.log(person1)
}else{
console.log(person2)
}
/**
* 求和方法
*/
function add(){
let size=Array.from(arguments); //转换类数组
let sum = 0 ;
for(let s of size){
sum += s;
}
return sum;
}
}
zjh(5)