清除数字
清除数字
给你一个字符串 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' ...
删除并获得点数
删除并获得点数
给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
输入:nums = [3,4,2]输出:6解释:删除 4 获得 4 个点数,因此 3 也被删除。之后,删除 2 获得 2 个点数。总共获得 6 个点数。
输入:nums = [2,2,3,3,3,4]输出:9解释:删除 3 获得 3 个点数,接着要删除两个 2 和 4 。之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。总共获得 9 个点数。
12345678910111213141516171819202122var deleteAndEarn = function(nums) { let maxVal = 0; for (const val of nums) { maxVal = Math.max(maxVa ...
最长回文子序列
最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
输入:s = “bbbab”输出:4解释:一个可能的最长回文子序列为 “bbbb” 。示例 2:
输入:s = “cbbd”输出:2解释:一个可能的最长回文子序列为 “bb” 。
12345678910111213141516171819202122var longestPalindromeSubseq = function(s) { let dp = new Array(s.length).fill().map(val =>Array(s.length).fill(0)) // for(let i = 0;i<s.length;i++){ // dp[i][i] = 1 // } for(let i = s.length-1;i>=0;i--){ for(j = i;j<s.length; ...
替换后的最长重复字符
替换后的最长重复字符
给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。在执行上述操作后,返回 包含相同字母的最长子字符串的长度。
输入:s = “ABAB”, k = 2
输出:4解释:用两个’A’替换为两个’B’,反之亦然。
输入:s = “AABABBA”, k = 1
输出:4解释:将中间的一个’A’替换为’B’,字符串变为 “AABBBBA”。子串 “BBBB” 有最长重复字母, 答案为 4。可能存在其他的方法来得到同样的结果。
1234567891011121314151617181920var characterReplacement = function(s, k) { let start=0//定义滑动窗口的开始 let dict={}//定义一个哈希对象 let numRepeatChar=0//重复字符串的长度 let longestStr=0//最后的输出结果 //从左到右遍历字符串 for(let end ...
给表达式添加运算符
给表达式添加运算符
给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回 所有 能够得到 target 的表达式。注意,返回表达式中的操作数 不应该 包含前导零。
输入: num = “123”, target = 6
输出: [“1+2+3”, “123”]解释: “123” 和 “1+2+3” 的值都是 6。
输入: num = “232”, target = 8
输出: [“23+2”, “2+32”]解释: “23+2” 和 “2+32” 的值都是 8。
123456789101112131415161718192021222324252627282930313233var addOperators = function(num, target) { const arr = []; const dfs = (str, idx, nextNum, res, nextRes) => { if (idx !== num ...