题目描述:
给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元素出现两次或两次以上。如果不存在这样的子字符串,则返回 -1 。
示例 1:
输入:s = “aa”
输出:0
解释:最优的子字符串是两个 ‘a’ 之间的空子字符串。
示例 2:
输入:s = “abca”
输出:2
解释:最优的子字符串是 “bc” 。
示例 3:
输入:s = “cbzxy”
输出:-1
解释:s 中不存在出现出现两次的字符,所以返回 -1 。
实例4:
输入:s = “cabbac”
输出:4
解释:最优的子字符串是 “abba” ,其他的非最优解包括 “bb” 和 “” 。
解题思路:
- 遍历字符串,对于每个字符都寻找其之后出现的相同字符。
- 如果相同字符出现在当前位置之后,则计算当前字符与其之间的字符串长度,并更新最大值。
- 如果相同字符没有出现在当前位置之后,则该字符无法参与构成满足要求的子字符串。
- 遍历结束后,如果找到了满足要求的子字符串,返回其长度;否则返回 -1 。
代码实现:
/** * @param {string} s * @return {number} */ var maxLengthBetweenEqualCharacters = function(s) { let maxLen = -1 for(let i =0;i<s.length;i++){ const j = s.lastIndexOf(s[i]) if(j>i) { maxLen = Math.max(maxLen,j-i-1) } } return maxLen };
时间复杂度:O(n^2)。
空间复杂度:O(1)。