那些前端用js手搓出来的算法与数据结构字符串篇

Posted 我是真的不会前端

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那些前端用js手搓出来的算法与数据结构字符串篇相关的知识,希望对你有一定的参考价值。

前端算法之字符串类算法

在学校时候我们用C学习数据结构时
串的结构体定义是这样的

typedef struct
	char *ch;	//指向动态分配存储区首地址的指针 
	int length; //串的长度 
Str;

字符串在js中是一种类型,也叫string型
直接new String 就能构造一个字符串
并且有着非常多的字符串方法index of()、slice(start, end)
substring(start, end)
substr(start, length)…
那现在总结几个字符串的算法题

1. 【面试真题】最长回文子串【双指针】

/**
* @param string s
* @return string
*/
var longestPalindrome = function(s) 
if (s.length === 1) return s;
let maxRes = 0, maxStr = '';
for (let i = 0; i < s.length; i++) 
let str1 = palindrome(s, i, i);
let str2 = palindrome(s, i, i + 1);
if (str1.length > maxRes) 
maxStr = str1;
maxRes = str1.length;

if (str2.length > maxRes) 
maxStr = str2;
maxRes = str2.length;


return maxStr;
;
function palindrome(s, l, r) 
while (l >= 0 && r < s.length && s[l] === s[r]) 
l--;
r++;

return s.slice(l + 1, r);

2. 最长公共前缀

/**
* @param string[] strs
* @return string
*/
var longestCommonPrefix = function(strs) 
if (strs.length === 0) return "";
let first = strs[0];
if (first === "") return "";
let minLen = Number.MAX_SAFE_INTEGER;
for (let i = 1; i < strs.length; i++) 
const len = twoStrLongestCommonPrefix(first, strs[i]);
minLen = Math.min(len, minLen);

return first.slice(0, minLen);
;
function twoStrLongestCommonPrefix (s, t) 
let i = 0, j = 0;
let cnt = 0;
while (i < s.length && j < t.length) 
console.log(s[i], t[j], cnt)
if (s[i] === t[j]) 
cnt++;
 else 
return cnt;

i++;
j++;
return cnt;

无重复字符的最长子串【双指针】

/**
* @param string s
* @return number
*/
var lengthOfLongestSubstring = function(s) 
let window = ;
let left = 0, right = 0;
let maxLen = 0, maxStr = '';
while (right < s.length) 
let c = s[right];
right++;
if (window[c]) window[c]++;
else window[c] = 1
while (window[c] > 1) 
let d = s[left];
left++;
window[d]--;

if (maxLen < right - left) 
maxLen = right - left;


return maxLen;
;

最小覆盖子串

/**
* @param string s
* @param string t
* @return string
*/
var minWindow = function(s, t) 
let need = , window = ;
for (let c of t) 
if (!need[c]) need[c] = 1;
else need[c]++;

let left = 0, right = 0;
let valid = 0, len = Object.keys(need).length;
let minLen = s.length + 1, minStr = '';
while (right < s.length) 
const d = s[right];
right++;
if (!window[d]) window[d] = 1;
else window[d]++;
if (need[d] && need[d] === window[d]) 
valid++;

console.log('left - right', left, right);
while (valid === len) 
if (right - left < minLen) 
minLen = right - left;
minStr = s.slice(left, right);

console.lo
let c = s[left];
left++;
window[c]--;
if (need[c] && window[c] < need[c]) 
valid--;



return minStr;
;

KMP算法

求出next数组

function pmtArr(target) 
    var pmtArr = []
    target = target.split('')
    for(var j = 0; j < target.length; j++) 
    //获取模式串不同长度下的部分匹配值
        var pmt = target
        var pmtNum = 0
        for (var k = 0; k < j; k++) 
            var head = pmt.slice(0, k + 1) //前缀
            var foot = pmt.slice(j - k, j + 1) //后缀
            if (head.join('') === foot.join('')) 
                var num = head.length
                if (num > pmtNum) pmtNum = num
            
        
        pmtArr.push(j + 1 - pmtNum) 
    
    return pmtArr


完整KMP算法

function mapKMPStr(base, target) 
    var isMatch = []
    var pmt = pmtArr(target)
    console.time('kmp')
    var times = 0
    for(var i = 0; i < base.length; i++) 
        times++
        var tempIndex = 0
        for(var j = 0; j < target.length; j++) 
            if(i + target.length <= base.length) 
                if (target.charAt(j) === base.charAt(i + j)) 
                    isMatch.push(target.charAt(j))
                 else 
                    if(!j) break //第一个就不匹配直接跳到下一个
                    var skip = pmt[j - 1]
                    tempIndex = i + skip - 1
                    break 
                
            
        
        var data = 
            index: i,
            matchArr: isMatch
        
        callerKmp.push(data)
        if(tempIndex) i = tempIndex
        if(isMatch.length === target.length) 
            console.timeEnd('kmp')
            console.log('移位次数:', times)
            return i
        
        isMatch = []
    
    console.timeEnd('kmp')
    return -1

kmp算法相关链接

KMP算法参考
KMP算法参考二
阮一峰博客
nextval简单讲解

以上是关于那些前端用js手搓出来的算法与数据结构字符串篇的主要内容,如果未能解决你的问题,请参考以下文章

那些前端用js手搓出来的算法与数据结构链表篇

那些前端用js手搓出来的算法与数据结构链表篇

前端与算法 leetcode 8. 字符串转换整数 (atoi)

手搓线性回归

前端知识 | Vue.js 的基础与入门

那些关于前端数据结构与算法