Given a string, find the length of the longest substring without repeating characters.
Examples:
Given “abcabcbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring.
翻译一下,在给定的一个字符串中,找出其中最长的无重复的字符串,注意!是字符串,而不是字符序列。
比如"pwwkew"
这个字符串中,最长的无重复子字符串是wke和kew。最长的无重复字符序列则是pwke。
我对该算法实现的思想是:
每个字符串中的字符在字符串中,都有自己的位置,如上图。
我们从初始位置开始比较,初始位置是0,对应的字母是C。
0和1比,如果不一样,那么0和1结合成一个子字符串,我们称为SubString1,然后SubString1和3比,如果SubString1中有字符和3匹配上了,那么我们看下是SubString中排哪个位置的字符和3匹配成功了,把SubString1对应位置处之后的字符和3结合。
比如这里的SubString={“CD”},3={“D”},SubString中的第二个字符”D”,和3对应的字符”D”相匹配,那么就把它从D处截断,{“CD/”} 斜杠表示截断,然后后续的和3结合。在这里,SubString从D截断后,后续没有了,则就是3单独成立。
在截断的同时,还需要把SubString存起来,方便后面比较。
大体的思路就是这样,中间还有一些细节,在实现算法的过程中,通过debug来慢慢发现,慢慢完善。
public class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.isEmpty()) {
return 0;
} else if (s.length() == 1) {
return 1;
} else {
ArrayList<String> arrayList = new ArrayList<>();
int j = 0;
for (int i = 1; i < s.length(); i++) {
String substring1 = s.substring(j, i);
String substring2 = s.substring(i, i + 1);
if (substring1.contains(substring2)) {
arrayList.add(substring1);
int i1 = substring1.indexOf(substring2) + j;
j = i1 + 1;
}
//substring中没有字符和substring匹配,并且已匹配到了给定字符串的最后
else if (!(substring1.contains(substring2))&&i+1==s.length()){
String concat = substring1.concat(substring2);
arrayList.add(concat);
}
}
//利用排序,排出最长的字符串,然后返回长度
Object[] objects = arrayList.toArray();
ArrayList<Integer> arrayList1 = new ArrayList<>();
for (int i = 0; i < objects.length; i++) {
int length = objects[i].toString().length();
arrayList1.add(length);
}
Object[] objects1 = arrayList1.toArray();
Arrays.sort(objects1);
return ((Integer) objects1[objects.length-1]);
}
}
}