今天精選的題目是關於字符串操做的,涉及到的技巧有字符串的滑動窗口思路、大數相乘。前端
LeetCode.567,難度中等微信
給定兩個字符串s1和s2,寫一個函數來判斷s2是否包含s1的排列。函數
換句話說,第一個字符串的排列之一是第二個字符串的子串。spa
示例1:code
輸入: s1 = "ab" s2 = "eidbaooo"
輸出: True
解釋: s2 包含 s1 的排列之一 ("ba").ip
示例2:rem
輸入: s1= "ab" s2 = "eidboaoo"
輸出: False字符串
注意:string
理解一下題意,要求s1的字符串排列之一是第二個字符串的子串,好比ab是eidbaooo的子串,ba也是eidbaooo的子串,一樣的baoo也是eidbaooo的子串,因此這個規則能夠抽象一下,若是eidbaooo裏面存在一個子串,該子串的字符和s1的字符相同,且該子串字符出現的次數和s1中的字符出現次數相同,所以,能夠考慮滑動窗口的思路。it
首先維護一個map1來保存s1的字符以及每一個字符出現的次數,再維護一個map2來保存當前窗口中的每一個字符以及每一個字符出現的次數,若是map1和map2相同,則說明滑動窗口中的字符子串和s1的排列之一相同,不然繼續往右滑動。
代碼以下:
/\*\* \* @param {string} s1 \* @param {string} s2 \* @return {boolean} \*/ let checkMapEqual = function(m1, m2) { let keys1 = Object.keys(m1), keys2 = Object.keys(m2); if(keys1.length !== keys2.length) return false; for(let i = 0;i < keys1.length;i++) { const curKey = keys1\[i\]; if(m1\[curKey\] !== m2\[curKey\]) return false; } return true; } let checkInclusion = function(s1, s2) { if(s1.length > s2.length) return false; let map1 = {}, map2 = {}; const len1 = s1.length, len2 = s2.length; // 初始化map for(let i = 0;i < len1;i++) { if(map1\[s1\[i\]\]) { map1\[s1\[i\]\]++ } else { map1\[s1\[i\]\] = 1; } if(map2\[s2\[i\]\]) { map2\[s2\[i\]\]++ } else { map2\[s2\[i\]\] = 1; } } for(let i = len1;i < len2;i++) { if(checkMapEqual(map1, map2)) { return true; } // 將窗口最左邊的字符刪去 const leftChar = s2\[i-len1\]; if(map2\[leftChar\] === 1) { delete map2\[leftChar\]; } else { map2\[leftChar\]--; } // 在窗口右邊加入一個字符 const rightChar = s2\[i\]; if(map2\[rightChar\]) { map2\[rightChar\]++; } else { map2\[rightChar\] = 1; } } return checkMapEqual(map1, map2); };
LeetCode.43,難度中等
給定兩個以字符串形式表示的非負整數num1
和num2
,返回num1
和num2
的乘積,它們的乘積也表示爲字符串形式。
示例 1:
輸入: num1 = "2", num2 = "3"
輸出: "6"
示例 2:
輸入: num1 = "123", num2 = "456"
輸出: "56088"
說明:
num1
和num2
的長度小於110。num1
和num2
只包含數字0-9
。num1
和num2
均不以零開頭,除非是數字 0 自己。先分析一下題目字符串相乘,要想模擬兩個數字相乘,須要解決逐位相乘、再逐個相加的問題,過程當中須要注意正確進位,好比'123'和'456'相乘:
代碼以下:
/\*\* \* @param {string} num1 \* @param {string} num2 \* @return {string} \*/ const multiplyStep = (num1, pos, num2) => { let res = ''; let carry = 0; for(let i = num2.length-1;i >= 0;i--) { const cur = num2\[i\]; let product = parseInt(cur)\*num1; if(carry) { product += carry; carry = 0; } if(product >= 10) { carry = parseInt(product/10); product = product%10 } res = product + res; } if(carry) { res = carry + res; } while(pos) { res += 0; pos--; } return res; } const addStep = (num1, num2) => { let len1 = num1.length; let len2 = num2.length; let num1Reversed = num1.split('').reverse().join(''); let num2Reversed = num2.split('').reverse().join(''); let index = 0; let res = ''; let carry = false; while(index < len1 && index < len2) { const char1 = num1Reversed\[index\]; const char2 = num2Reversed\[index\]; let sum = parseInt(char1) + parseInt(char2); if(carry) { sum += 1; carry = false; } if(sum >= 10) { carry = true; sum = sum%10; } res += sum; index++; } while(index < len1) { let cur = num1Reversed\[index\]; if(carry) { carry = false cur = parseInt(cur)+1; } if(cur >= 10) { cur = cur%10; carry = true; } res += cur; index++; } while(index < len2) { let cur = num2Reversed\[index\]; if(carry) { carry = false cur = parseInt(cur)+1; } if(cur >= 10) { cur = cur%10; carry = true; } res += cur; index++; } if(carry) { res += 1; carry = false; } return res.split('').reverse().join(''); } var multiply = function(num1, num2) { if(num1 === '0' || num2 === '0') return '0'; let strArr = \[\]; let res = '0'; for(let i = num1.length-1;i >= 0;i--) { strArr.push( multiplyStep(num1\[i\], num1.length-1-i, num2) ) } console.log(strArr); for(let i = 0;i < strArr.length;i++) { res = addStep(res, strArr\[i\]); } return res; };
感興趣的能夠關注個人微信公衆號,前端亞古獸