同位字符串连接的最小长度
同位字符串连接的最小长度
给你一个字符串 s ,它由某个字符串 t 和若干 t 的 同位字符串 连接而成。请你返回字符串 t 的 最小 可能长度。同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。
输入:s = “abba”输出:2解释:一个可能的字符串 t 为 “ba” 。
输入:s = “cdef”输出:4解释:一个可能的字符串 t 为 “cdef” ,注意 t 可能等于 s 。
1234567891011121314151617181920var minAnagramLength = function(s) { let m = s.length let n = m/2 let i = 1 while(i<=n){ if(m%i==0){ let p = new Set() let j = 0 while(j<m/i){ let d ...
最长有效括号
最长有效括号
给你一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
输入:s = “(()”输出:2解释:最长有效括号子串是 “()”
输入:s = “)()())”输出:4解释:最长有效括号子串是 “()()”
1234567891011121314151617181920212223var longestValidParentheses = function(s) { let max = 0; let stack = [-1]; for (let i = 0; i < s.length; i++) { if (s[i] === ')') { stack.pop(); if (stack.length === 0) { stack.push(i); continue; } const cur = i - stack[stack.length - 1]; if (cur & ...
将字符串翻转到单调递增
将字符串翻转到单调递增
如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。返回使 s 单调递增 的最小翻转次数。
输入:s = “00110”输出:1解释:我们翻转最后一位得到 00111.
输入:s = “010110”输出:2解释:我们翻转得到 011111,或者是 000111。
12345var minFlipsMonoIncr = function(s) { let c = 0; while (s.indexOf('10') > -1) s = s.replace(/10/g, () => (c++, '')); return c;};
验证回文串 II
验证回文串 II
给你一个字符串 s,最多 可以从中删除一个字符。请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。
输入:s = “aba”输出:true
输入:s = “abca”输出:true解释:你可以删除字符 ‘c’ 。
12345678910111213141516171819202122function isPalindrome(str, l, r) { while (l < r) { //对撞指针不断判断两边的数字是否相等 if (str[l] != str[r]) { return false; } l++; r--; } return true;}var validPalindrome = function (str) { let l = 0, r = str.length - 1; //头尾指针 while (l < r) & ...
清除数字
清除数字
给你一个字符串 s 。你的任务是重复以下操作删除 所有 数字字符:删除 第一个数字字符 以及它左边 最近 的 非数字 字符。请你返回删除所有数字字符以后剩下的字符串。
输入:s = “abc”输出:”abc”解释:字符串中没有数字。
输入:s = “cb34”输出:””解释:一开始,我们对 s[2] 执行操作,s 变为 “c4” 。然后对 s[1] 执行操作,s 变为 “” 。
123456789101112var clearDigits = function(s) { let stack = [] for(let i = 0; i < s.length; i++) { if(stack.length > 0 && /[0-9]/.test(s[i]) && /[a-zA-Z]/.test(stack[stack.length - 1])) stack.pop() else stack.push(s[i]) ...
最短回文串
最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
输入:s = “aacecaaa”输出:”aaacecaaa”
输入:s = “abcd”输出:”dcbabcd”
12345678910111213var shortestPalindrome = function(s) { const len = s.length if (len === 0) return '' // 反转字符串s let rev = s.split('').reduce((a, b) => b + a, '') for (let i = 0; i < len; i++) { // 根据字符串反转前后是否相等来判断字符串是不是回文字符串【rev.slice(i)就是s.slice(0, len - i)的反转字符串】 if (s.slice(0, len - i) === rev.sl ...
奇怪的打印机
奇怪的打印机
有台奇怪的打印机有以下两个特殊要求:打印机每次只能打印由 同一个字符 组成的序列。每次可以在从起始到结束的任意位置打印新字符,并且会覆盖掉原来已有的字符。给你一个字符串 s ,你的任务是计算这个打印机打印它需要的最少打印次数。
输入:s = “aaabbb”输出:2解释:首先打印 “aaa” 然后打印 “bbb”。
输入:s = “aba”输出:2解释:首先打印 “aaa” 然后在第二个位置打印 “b” 覆盖掉原来的字符 ‘a’。
1234567891011121314151617181920212223var strangePrinter = function(s) { const n = s.length; const dp = new Array(n); for (let i = 0; i < n; i++) { dp[i] = new Array(n).fill(0) } for (let i = n-1; i>=0; i--) { dp[i] ...
重复叠加字符串匹配
重复叠加字符串匹配
给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。
输入:a = “abcd”, b = “cdabcdab”输出:3解释:a 重复叠加三遍后为 “abcdabcdabcd”, 此时 b 是其子串。
输入:a = “a”, b = “aa”输出:2
123456var repeatedStringMatch = function(a, b) { const count = Math.ceil(b.length / a.length); if (a.repeat(count).includes(b)) return count; if (a.repeat(count + 1).includes(b)) return count + 1; return -1;};
回文子串
回文子串
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。
输入:s = “abc”输出:3解释:三个回文子串: “a”, “b”, “c”
输入:s = “aaa”输出:6解释:6 个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
12345678910111213141516171819202122const isPalindrome = (s) => { let i = 0; let j = s.length - 1; while (i < j) { if (s[i] != s[j]) return false; i++; j--; } return true;};const countSubstrings = (s) => { let count = 0; for (let i = 0; i < s.length; i++) ...
求解方程
求解方程
求解一个给定的方程,将 x 以字符串 “x=#value” 的形式返回。该方程仅包含 ‘+’ , ‘-‘ 操作,变量 x 和其对应系数。如果方程没有解或存在的解不为整数,请返回 “No solution” 。如果方程有无限解,则返回 “Infinite solutions” 。题目保证,如果方程中只有一个解,则 ‘x’ 的值是一个整数。
输入: equation = “x+5-3+x=6+x-2”输出: “x=2”
输入: equation = “x=x”输出: “Infinite solutions”
123456789101112131415161718192021222324var solveEquation = function(equation) { let a = 0, b = 0, c = 0, sign = 1, left = 1, hasC = false; for (let z of equation) { switch (z) { case 'x' ...