分割回文串 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 ...
不含 AAA 或 BBB 的字符串
不含 AAA 或 BBB 的字符串
给定两个整数 a 和 b ,返回 任意 字符串 s ,要求满足:s 的长度为 a + b,且正好包含 a 个 ‘a’ 字母与 b 个 ‘b’ 字母;子串 ‘aaa’ 没有出现在 s 中;子串 ‘bbb’ 没有出现在 s 中。
输入:a = 1, b = 2
输出:”abb”解释:”abb”, “bab” 和 “bba” 都是正确答案。
输入:a = 4, b = 1
输出:”aabaa”
123456789101112131415161718192021222324var strWithout3a3b = function(A, B) { var max = Math.max(A, B), min = B, a,b, str=''; if (max - 3 >= 2 * min){return false;} if (max == A) { a = 'a'; b = 'b'; ...
比较含退格的字符串
比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。
输入:s = “ab#c”, t = “ad#c”
输出:true解释:s 和 t 都会变成 “ac”。
输入:s = “ab##”, t = “c#d#”
输出:true解释:s 和 t 都会变成 “”。
12345678910111213141516171819202122232425262728293031var backspaceCompare = function(S, T) { let i = S.length - 1, j = T.length - 1, skipS = 0, skipT = 0; //双指针从右往左循环 while(i >= 0 || j >= 0){ while(i >= 0){//处理掉# 直到left指向的字符右边退格全部处理掉 ...
仅仅反转字母
仅仅反转字母
给你一个字符串 s ,根据下述规则反转字符串:所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。返回反转后的 s 。
输入:s = “ab-cd”
输出:”dc-ba”
输入:s = “a-bC-dEf-ghIj”
输出:”j-Ih-gfE-dCba”
12345678910111213141516171819var reverseOnlyLetters = function(s) { const min1 = 'a', max1 = 'z'; const min2 = 'A', max2 = 'Z'; const arr = s.split(''); const queue = []; // 判断字符是否为字母 const isAlp = (arr,i) => {return arr[i] >= min1 && arr[i] <= max1 || arr ...
每个元音包含偶数次的最长子字符串
每个元音包含偶数次的最长子字符串
给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,’e’,’i’,’o’,’u’ ,在子字符串中都恰好出现了偶数次。
输入:s = “eleetminicoworoep”
输出:13解释:最长子字符串是 “leetminicowor” ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。
输入:s = “leetcodeisgreat”
输出:5解释:最长子字符串是 “leetc” ,其中包含 2 个 e 。
123456789101112131415161718var findTheLongestSubstring = function(str) { let res = 0 let state = 0 // 前缀区间的state状态 let vowel = { a: 1, e: 2, i: 4, o: 8, u: 16 } // 对照表 let map = { 0: -1 } // map存放各个前缀区间的state ...