两个相同字符之间的最长子字符串
两个相同字符之间的最长子字符串
给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度 ,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1 。子字符串 是字符串中的一个连续字符序列。
输入:s = “aa”输出:0解释:最优的子字符串是两个 ‘a’ 之间的空子字符串。
输入:s = “abca”输出:2解释:最优的子字符串是 “bc” 。
s 是一个半重复字符串。
1234567891011121314var maxLengthBetweenEqualCharacters = function(s) { let m = new Map(); for (let i=0; i<s.length; i++) { if (!m.has(s[i])) m.set(s[i], [i]); else m.get(s[i])[1] = i; } let res = -1; for (let v of m.values()) { if (v.lengt ...
找到最长的半重复子字符串
找到最长的半重复子字符串
给你一个下标从 0 开始的字符串 s ,这个字符串只包含 0 到 9 的数字字符。如果一个字符串 t 中至多有一对相邻字符是相等的,那么称这个字符串 t 是 半重复的 。例如,”0010” 、”002020” 、”0123” 、”2002” 和 “54944” 是半重复字符串,而 “00101022” (相邻的相同数字对是 00 和 22)和 “1101234883” (相邻的相同数字对是 11 和 88)不是半重复字符串。请你返回 s 中最长半重复子字符串的长度。
输入:s = “52233”输出:4解释:最长的半重复子字符串是 “5223”。整个字符串 “52233” 有两个相邻的相同数字对 22 和 33,但最多只能选取一个。
输入:s = “5494”输出:4解释:
s 是一个半重复字符串。
1234567891011121314151617181920var longestSemiRepetitiveSubstring = function(s) { const n = s.length let i = 0 le ...
成为 K 特殊字符串需要删除的最少字符数
成为 K 特殊字符串需要删除的最少字符数
给你一个字符串 word 和一个整数 k。如果 |freq(word[i]) - freq(word[j])| <= k 对于字符串中所有下标 i 和 j 都成立,则认为 word 是 k 特殊字符串。此处,freq(x) 表示字符 x 在 word 中的出现频率,而 |y| 表示 y 的绝对值。返回使 word 成为 k 特殊字符串 需要删除的字符的最小数量。
输入:word = “aabcaba”, k = 0输出:3解释:可以删除 2 个 “a” 和 1 个 “c” 使 word 成为 0 特殊字符串。word 变为 “baba”,此时 freq(‘a’) == freq(‘b’) == 2。
输入:word = “dabdcbdcdcd”, k = 2输出:2解释:可以删除 1 个 “a” 和 1 个 “d” 使 word 成为 2 特殊字符串。word 变为 “bdcbdcdcd”,此时 freq(‘b’) == 2,freq(‘c’) == 3,freq(‘d’) == 4。
12345678910111213141 ...
字符串及其反转中是否存在同一子字符串
字符串及其反转中是否存在同一子字符串
给你一个字符串 s ,请你判断字符串 s 是否存在一个长度为 2 的子字符串,在其反转后的字符串中也出现。如果存在这样的子字符串,返回 true;如果不存在,返回 false 。
输入:s = “leetcode”输出:true解释:子字符串 “ee” 的长度为 2,它也出现在 reverse(s) == “edocteel” 中。
输入:s = “abcba”输出:true解释:所有长度为 2 的子字符串 “ab”、”bc”、”cb”、”ba” 也都出现在 reverse(s) == “abcba” 中。
12345678910111213var isSubstringPresent = function(s) { let i let tmp = s.split('').reverse().join('') for(i = 0;i < s.length-1;i ++){ let cur = s[i] + s[i+1] //假设为AB ...
移除指定数字得到的最大结果
移除指定数字得到的最大结果
给你一个表示某个正整数的字符串 number 和一个字符 digit 。从 number 中 恰好 移除 一个 等于 digit 的字符后,找出并返回按 十进制 表示 最大 的结果字符串。生成的测试用例满足 digit 在 number 中出现至少一次。
输入:number = “123”, digit = “3”输出:”12”解释:”123” 中只有一个 ‘3’ ,在移除 ‘3’ 之后,结果为 “12” 。
输入:number = “1231”, digit = “1”输出:”231”解释:可以移除第一个 ‘1’ 得到 “231” 或者移除第二个 ‘1’ 得到 “123” 。由于 231 > 123 ,返回 “231” 。
123456789101112131415161718192021var removeDigit = function(number, digit) { let ans = '', del = false; for (let i = 0; i < number.length ...
字符串解码
字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
输入:s = “3[a]2[bc]”输出:”aaabcbc”
输入:s = “3[a2[c]]”输出:”accaccacc”
123456789101112131415161718192021222324var decodeString = function(s) { let numStack = []; let strStack = []; let ans = ""; let count = 0; for (let i = 0; i < s.length; i++) { let ...
使三个字符串相等
使三个字符串相等
给你三个字符串 s1、s2 和 s3。 你可以根据需要对这三个字符串执行以下操作 任意次数 。在每次操作中,你可以选择其中一个长度至少为 2 的字符串 并删除其 最右位置上 的字符。如果存在某种方法能够使这三个字符串相等,请返回使它们相等所需的 最小 操作次数;否则,返回 -1。
输入:s1 = “abc”,s2 = “abb”,s3 = “ab”输出:2解释:对 s1 和 s2 进行一次操作后,可以得到三个相等的字符串。可以证明,不可能用少于两次操作使它们相等。
输入:s1 = “dac”,s2 = “bac”,s3 = “cac”输出:-1解释:因为 s1 和 s2 的最左位置上的字母不相等,所以无论进行多少次操作,它们都不可能相等。因此答案是 -1 。
12345678910111213141516var findMinimumOperations = function(s1, s2, s3) { if (s1[0] != s2[0] || s1[0] != s3[0] || s2[0] != s3[0]) { ...
连续字符
连续字符
给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串 s 的 能量。
输入:s = “leetcode”输出:2解释:子字符串 “ee” 长度为 2 ,只包含字符 ‘e’ 。
输入:s = “abbcccddddeeeeedcba”输出:5解释:子字符串 “eeeee” 长度为 5 ,只包含字符 ‘e’ 。
12345678910var maxPower = function(s) { let ans = 0 for(let i=0,j=0;i<s.length;){ while(j<s.length&&s.charAt(j)==s.charAt(i)) j++ ans = Math.max(ans, j - i) i = j } return ans};
单词距离
单词距离
有个内含单词的超大文本文件,给定任意两个不同的单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
输入:words = [“I”,”am”,”a”,”student”,”from”,”a”,”university”,”in”,”a”,”city”], word1 = “a”, word2 = “student”输出:1
12345678910111213141516var findClosest = function(words, word1, word2) { let [index1, index2] = [-1,-1]; let result = words.length; for(let i = 0; i < words.length; i ++){ let word = words[i]; if(word === word1){ index1 = i; } ...
去除重复字母
去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
输入:s = “bcabc”输出:”abc”
输入:s = “cbacdcbc”输出:”acdb”
12345678910111213var removeDuplicateLetters = function(s) { var stack = [] for (var i = 0; i < s.length; i++) { var char = s[i] if (stack.indexOf(char) > -1) continue // 使用indexOf(xx, i)取代 lastIndexOf(xx)减少遍历次数会更快 while (stack.length > 0 && stack[stack.length - 1] > char && s.indexOf(stack[stack.length - 1], i) > ...