解题思路
首先把字符串转为字符串数组,这样就可以逐一进行判断。为了降低算法的时间复杂度,我们使用LinkedList来存储数据,这样我们只要遍历字符串数组一遍就可以输出结果。逐一判断,一旦遇到在链表中不存在的字符,就加入链表,若在链表中已存在,则把链表中的第一个遇到的相同字符及其之前的字符删除,在这个过程中更新最长子串长度。
LinkedList
本体用到了LinkedList的几个方法,我们来简单介绍一下它的使用:
1、add(); // 将指定元素添加到此列表的结尾。
2、contains(); //如果此列表包含指定元素,则返回 true。
3、indexOf(); // 返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
4、size(); // 返回此列表的元素数。
5、remove(); //移除此列表中指定位置处的元素。
代码实现
public class Solution {
public static void main(String[] args) {
String str = "ohomm";
System.out.println(lengthOfLongestSubstring(str));
}
public static int lengthOfLongestSubstring(String s) {
int res = 0;
LinkedList<Character> list = new LinkedList<>();
char[] arr = s.toCharArray();
for(int i=0;i<s.length();i++)
{
if(!list.contains(arr[i]))
{
list.add(arr[i]);
if(list.size()>res)
res=list.size();
}
else
{
list.add(arr[i]);
int first = list.indexOf(arr[i]);
for(int j=0; j<=first;j++)
list.remove(0);
}
}
return res;
}
修改str字符串可观察在不同字符串下的输出结果。