zoukankan      html  css  js  c++  java
  • Longest Substring Without Repeating Characters

    题目链接:

    https://leetcode.com/problems/longest-substring-without-repeating-characters/

    题目要求是,求出最长无重复子序列的长度。

    比如:

    maxLen(abba) = 2;

    maxLen(pawwakew) = 4;

    maxLen(leetcode) = 5;

    解题思路:

    利用哈希表,定义一个数组charIndex[128],用来保存对应位置的字符的最新下标,每次该数组被更新时,说明遇到了重复字符。

    定义3个变量start、to、maxLen,start用来表示不重复字符的开始位置,当遇到重复字符时,更新start的值;to用来遍历字符串数组,maxLen用来记录最大无重复的子序列的长度。

    另外,还要注意几种特殊情况。

    代码如下:

    public int lengthOfLongestSubstring(String s) {
    	if(s.equals(""))
    		return 0;
    	if(s.length() == 1)
    		return 1;
    	
    	int start = 0, to = 0;	// start无重复子序列的开始位置;to用于遍历字符串
    	int maxLen = 1;	// 无重复子序列的最大长度
    	int[] charIndex = new int[128];	// 记录对应字符的最新下标
    	for(int i = 0; i < 128; i ++)
    		charIndex[i] = -1;
    	
    	for(to = 0; to < s.length(); to ++) {
    		int repeatIndex = charIndex[s.charAt(to)]; // 找到数组charIndex中该字符对应的位置
    		
    		// 如果该位置不为-1,表示遇到了重复字符
    		if(repeatIndex >= start && repeatIndex != -1) {
    			if(to - start > maxLen)
    				maxLen = to - start;					
    			start = repeatIndex + 1;	// 改变start的值
    		} 
    		
    		// 处理边界情况
    		if(to == s.length() - 1) {
    			if(to - start + 1 > maxLen)
    				maxLen = to - start + 1;
    		}
    		
    		// 每次遍历,无论该字符是否重复,都一律记录其位置
    		charIndex[s.charAt(to)] = to;
    	}
    	
    	return maxLen;
    }
    

      

      

  • 相关阅读:
    有关C#中List排序的总结
    配置jdk1.8.0_77
    New Day
    HDU 4288 Coder 线段树
    AOJ 169 找零钱 DP OR 母函数
    HDU 3954 Level up 线段树
    HDU 3016 Man Down 线段树+简单DP
    HDU 4027 Can you answer these queries? 线段树
    HDU 3333 Turing Tree 树状数组 离线查询
    POJ 2464 Brownie Points II 树状数组+扫描线
  • 原文地址:https://www.cnblogs.com/yuan2016/p/5289541.html
Copyright © 2011-2022 走看看