删除并获得点数
删除并获得点数
给你一个整数数组 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 ...
分割回文串 II
分割回文串 II
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的 最少分割次数 。
输入:s = “aab”
输出:1解释:只需一次分割就可将 s 分割成 [“aa”,”b”] 这样两个回文子串。
输入:s = “a”
输出:0
12345678910111213141516171819202122var minCut = function(s) { var n = s.length; var temp = new Array(n).fill(0).map(item=>new Array(n).fill(true)); var dp = new Array(n).fill(Number.MAX_SAFE_INTEGER); for(var i = n-1;i>=0;i--){ for(var j = i+1;j<n;j++){ temp[i][j] = s[i] === s[j] && temp[i+1][j-1 ...
不同的子序列
不同的子序列
给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。
输入:s = “rabbbit”, t = “rabbit”
输出:3解释:如下所示, 有 3 种可以从 s 中得到 “rabbit” 的方案。rabbbitrabbbitrabbbit
输入:s = “babgbag”, t = “bag”
输出:5解释:如下所示, 有 5 种可以从 s 中得到 “bag” 的方案。babgbagbabgbagbabgbagbabgbagbabgbag
1234567891011121314var numDistinct = function(s, t) { let dp = Array.from({length: s.length + 1}, _ => Array(t.length + 1).fill(0)); for (let i = 0; i <= s.length; i++) dp[i][0] = 1; for (let i = 1; i & ...
最长回文串
最长回文串
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串的长度。在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。
输入:s = “abccccdd”
输出:7解释:我们可以构造的最长的回文串是”dccaccd”, 它的长度是 7。
输入:s = “a”
输出:1解释:可以构造的最长回文串是”a”,它的长度是 1。
12345678910111213141516var longestPalindrome = function(s) { var countObj = {}; var res = 0;//最大 for(var i=0;i<s.length;i++){ if(!countObj[s[i]]){ countObj[s[i]] = 1; }else{ res +=2; delete countObj[s[i]]; ...
环绕字符串中唯一的子字符串
环绕字符串中唯一的子字符串
定义字符串 base 为一个 “abcdefghijklmnopqrstuvwxyz” 无限环绕的字符串,所以 base 看起来是这样的:“…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd….”.给你一个字符串 s ,请你统计并返回 s 中有多少 不同非空子串 也在 base 中出现。
输入:s = “a”
输出:1解释:字符串 s 的子字符串 “a” 在 base 中出现。
输入:s = “cac”
输出:2解释:字符串 s 有两个子字符串 (“a”, “c”) 在 base 中出现。
123456789101112131415161718192021222324var findSubstringInWraproundString = function(p) { if(!p.length){ return 0; } //用来记录子串 let pre=1,res=0,hash={ [p[ ...
根据字符出现频率排序
根据字符出现频率排序
给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。返回 已排序的字符串 。如果有多个答案,返回其中任何一个。
输入: s = “tree”
输出: “eert”解释: ‘e’出现两次,’r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,”eetr”也是一个有效的答案。
输入: s = “cccaaa”
输出: “cccaaa”解释: ‘c’和’a’都出现三次。此外,”aaaccc”也是有效的答案。注意”cacaca”是不正确的,因为相同的字母必须放在一起。
12345678910111213var frequencySort = function(s) { const map = new Map() for(let i = 0;i < s.length;i++) { if(map.has(s[i])) { map.set(s[i], s[i]+map.get(s[i])) ...
等式方程的可满足性
等式方程的可满足性
给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:”a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。注意 ,如果最小值或者最大值有重复元素,可以删除任意一个。
输入:[“a==b”,”b!=a”]
输出:false解释:如果我们指定,a = 1 且 b = 1,那么可以满足第一个方程,但无法满足第二个方程。没有办法分配变量同时满足这两个方程。
输入:[“b==a”,”a==b”]
输出:true解释:我们可以指定 a = 1 且 b = 1 以满足满足这两个方程。
1234567891011121314151617181920212223242526272829303132var equationsPossible = function(equations) { let parent = new Array(26); f ...