博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
003LeetCode--LongestSubstring
阅读量:4527 次
发布时间:2019-06-08

本文共 2557 字,大约阅读时间需要 8 分钟。

003LongestSubstring(寻找最大非重复子字符串)

学习LeetCode打卡第 3 天重要提示:原文出处在 ,感谢博主大大的无私分享),这篇博文主要记录自己的学习心得,2018年了,在此祝福大家学习进步,工作顺利!

下面先给出博主原文,然后在博主的代码基础上修改出可运行程序。

 

原题

  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开始已经出现过的时候,子串开始位置start更新为:当前重复字符在当前子串内第一次出现时的位置+1,否则更新map中的hash值为当前位置

 

import java.util.Arrays;import java.util.HashMap;import java.util.Map;public class LongestSubstring {      /**     * 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
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; } public static void main(String[] args) { String str = "ACBDEABGHA"; System.out.println(new LongestSubstring().lengthOfLongestSubstring(str)); }}

 

转载于:https://www.cnblogs.com/iCodingLife/p/8289809.html

你可能感兴趣的文章
ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致”...
查看>>
Javaweb之 servlet 开发详解1
查看>>
Restore IP Addresses
查看>>
DWR框架简单应用
查看>>
KMP 学习心得-----转
查看>>
time.strftime:格式化字符串中含中文报错处理
查看>>
模态窗口缓存无法清除怎么办? 在地址上加个随机数吧"&rd=" + new Date().getTime()
查看>>
阿里的weex框架到底是什么
查看>>
Tesis enDYNA
查看>>
FxZ,C#开发职位面试测试题(30分钟内必须完成)
查看>>
[HNOI2007]分裂游戏
查看>>
Pandas基本介绍
查看>>
当拖动滚动条时 出现小图标
查看>>
LeetCode "Shortest Word Distance II"
查看>>
绕过阿里云防火墙继续扫描探测和SQL注入
查看>>
ln 软链接与硬链接
查看>>
JQuery ajax请求一直返回Error(parsererror)
查看>>
利用POI 技术动态替换word模板内容
查看>>
LeetCode No.168
查看>>
纪录jmeter loop controller 使用中的一个坑
查看>>