【LeetCode-面试算法经典-Java实现】【003-Longest Substring Without Repeating Characters(最长非重复子字符串)】
来源:互联网 发布:网上点餐软件 编辑:程序博客网 时间:2024/06/08 03:05
【003-Longest Substring Without Repeating Characters(最长非重复子字符串)】
原题
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3. For “bbbbb” the longest substring is “b”, with the length of 1.
题目大意
给定一个字符串,找字符中的最大非重复子串
解题思路
用start记录当前处理的开始位置 历遍字符串,当当前字符从开始位置start开始已经出现过的时候,子串开始位置+1,否则更新map中的hash值为当前位置
代码实现
import java.util.Arrays;import java.util.HashMap;import java.util.Map;/** * Author: 王俊超 * Date: 2015-06-17 * Time: 20:46 * Declaration: All Rights Reserved !!! */public class Solution { /** * 003-Longest Substring Without Repeating Characters(最长非重复子字符串) * * @param s 输入字符串 * @return 最大非重复子串长度 */ // 可以处理所有的UTF-8字符 public int lengthOfLongestSubstring(String s) { // 字符串输入不合法 if (s == null) { return 0; } // 当前处理的开始位置 int start = 0; // 记录到的最大非重复子串长度 int result = 0; // 访问标记,记录最新一次访问的字符和位置 Map<Character, Integer> map = new HashMap<>(s.length()); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); // 如果字符已经出现过(在标记开位置算起),就重新标记start if (map.containsKey(ch) && map.get(ch) >= start) { start = map.get(ch) + 1; } // 如果没有出现过就求最大的非重复子串的长度 else { result = Math.max(result, i - start + 1); } // 更新访问记录 map.put(ch, i); } return result; } // 只考虑ASCII字符【解法二】 public int lengthOfLongestSubstring2(String s) { // 字符串输入不合法 if (s == null) { return 0; } // 标记字符是否出现过,并且记录是的最新一次访问的元素的位置 int[] appear = new int[256]; // 初始化为-1 Arrays.fill(appear, -1); // 当前处理的开始位置 int start = 0; // 保存结果 int result = 0; for (int i = 0; i < s.length(); i++) { // 如果字符已经出现过(在标记开位置),就重新标记start if (appear[s.charAt(i)] >= start) { start = i + 1; } // 如果没有出现过就求最大的非重复子串的长度 else { result = Math.max(result, i - start + 1); } // 标记第i个字符已经被访问过(最新是第i个位置) appear[s.charAt(i)] = i; } return result; }}
评测结果
点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。
特别说明
欢迎转载,转载请注明出处【http://blog.csdn.net/derrantcm/article/details/46921991】
5 1
- 【LeetCode-面试算法经典-Java实现】【003-Longest Substring Without Repeating Characters(最长非重复子字符串)】
- 【LeetCode】003 Longest Substring Without Repeating Characters 最长的没有重复的子字符串
- 算法练习3.Longest Substring Without Repeating Characters 最长不重复子字符串(map)
- Longest Substring Without Repeating Characters(最长无重复子字符串算法)
- [LeetCode]3. Longest Substring Without Repeating Characters 最长无重复子串解析。java
- LeetCode 题解 3. Longest Substring Without Repeating Characters(最长不含重复字符的子字符串)
- leetcode:Longest Substring Without Repeating Characters (寻找最长无重复字符的子串)
- LeetCode | Longest Substring Without Repeating Characters(最长连续不重复子串)
- LeetCode OJ 之 Longest Substring Without Repeating Characters (无重复的最长子串)
- [C++]LeetCode 3: Longest Substring Without Repeating Characters(最长不重复子串)
- Leetcode Longest Substring Without Repeating Characters(最长不重复子串)
- leetcode系列(31)Longest Substring Without Repeating Characters 最长不重复子串
- leetcode 3 : Longest Substring Without Repeating Characters 最长无重复子串 (C# 语言版)
- LeetCode 3. Longest Substring Without Repeating Characters(最长不重复子串)
- Leetcode#3. Longest Substring Without Repeating Characters(最长不重复子串-哈希))
- leetcode 3. Longest Substring Without Repeating Characters 最长不重复子串和重复子串
- leetcode解题之3. Longest Substring Without Repeating Characters Java版(最长子串长度)
- LeetCode Longest Substring Without Repeating Characters 最长不重复子串查找
- java.lang.AbstractMethodError: 的一种错误可能
- tar: Exiting with failure status due to previous errors
- First Bad Version
- 深入浅出数据分析(一)——MySQL+EXCEL+R统计问卷调查
- 一个Linux内核的自旋锁设计-接力嵌套堆栈式自旋锁
- 【LeetCode-面试算法经典-Java实现】【003-Longest Substring Without Repeating Characters(最长非重复子字符串)】
- 算法分析与设计实验四 密码算法
- 【LeetCode-面试算法经典-Java实现】【004-Median of Two Sorted Arrays(两个排序数组的中位数)】
- C++ 类初探
- 【LeetCode-面试算法经典-Java实现】【005-Longest Palindromic Substring(最长回文子串)】
- pat 1001. A+B Format (20)
- 【Hibernate二】对象的状态
- SDWebImage使用入门
- Vim 常用快捷键