无重复字符的最长子串java实现

解题思路

首先把字符串转为字符串数组,这样就可以逐一进行判断。为了降低算法的时间复杂度,我们使用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字符串可观察在不同字符串下的输出结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值