无重复字符的最长子串
今天是小安开始Leetcode刷题的第三题,正文开始ing?
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。题目原址
示例
【示例1】
输入: “abcabcbb”
输出:3
解释:因为无重复字符的最长子串是 “abc”,所以其长度为 3。
【示例2】
输入: “bbbbb”
输出:1
解释:因为无重复字符的最长子串是 “b”,所以其长度为 1。
【示例3】
输入: “pwwkew”
输出:3
解释:因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
方法2:暴力法
思想
【思路】
逐个检查所有的子字符串,看它是否不含有重复的字符。
代码实现
【JAVA实现】
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = i + 1; j <= n; j++)
if (allUnique(s, i, j)) ans = Math.max(ans, j - i);
return ans;
}
public boolean allUnique(String s, int start, int end) {
Set<Character> set = new HashSet<>();
for (int i = start; i < end; i++) {
Character ch = s.charAt(i);
if (set.contains(ch)) return false;
set.add(ch);
}
return true;
}
}
复杂度分析
- 时间复杂度:
O
(
n
3
)
O(n^3)
O(n3),要验证索引范围在 [i, j)内的字符是否都是唯一的,我们需要检查该范围中的所有字符。 因此,它将花费
O
(
j
−
i
)
O(j−i)
O(j−i) 的时间。对于给定的 i,对于所有
j
∈
[
i
+
1
,
n
]
j∈[i+1,n]
j∈[i+1,n] 所耗费的时间总和为:
∑
i
+
1
n
O
(
j
−
i
)
\sum_{i+1}^{n}O(j - i)
∑i+1nO(j−i)
因此,执行所有步骤耗去的时间总和为:因此,执行所有步骤耗去的时间总和为:
O ( ∑ i = 0 n − 1 ( ∑ j = i + 1 n ( j − i ) ) ) = O ( ∑ i = 0 n − 1 ( 1 + n − i ) ( n − i ) 2 ) = O ( n 3 ) O\left(\sum_{i = 0}^{n - 1}\left(\sum_{j = i + 1}^{n}(j - i)\right)\right) = O\left(\sum_{i = 0}^{n - 1}\frac{(1 + n - i)(n - i)}{2}\right) = O(n^3) O(∑i=0n−1(∑j=i+1n(j−i)))=O(∑i=0n−12(1+n−i)(n−i))=O(n3)
- 空间复杂度: O ( m i n ( n , m ) ) O(min(n,m)) O(min(n,m)),我们需要 O(k)的空间来检查子字符串中是否有重复字符,其中 k 表示 Set 的大小。而 Set 的大小取决于字符串 n 的大小以及字符集/字母 m 的大小。
Thanks
一起加油哦~~
附待后续揭秘的算法
int lengthOfLongestSubstring(char* s) {
char*p = s;
int i= 0,j = 0,len =0;
for(j=0;*(p+j)!='\0';j++){
for(i=0;i<j;i++){
if(*(p+i)==*(p+j)){
p=p+i+1;
if(j>len) len=j;
j=0;
break;
}
}
}
len = (j>len)?j:len;
return len;
}