3、字符串求最长子串

问题:

给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b",其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是 "wke",其长度为 3。
请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。

思路

  • 思路1:两循环来获取所有子串,通过HashMap判断字符是否重复
 public static int lengthOfLongestSubstring(String s) {
        int len = 0;
        Map map = new HashMap();
        for (int i = 0; i < s.length(); i++) {
            for (int j = i; j < s.length(); j++) {
                char tmp = s.charAt(j);
                if (map.containsKey(tmp)) {
                    len = len < map.size() ? map.size() : len;
                    map.clear();
                    break;
                } else {
                    map.put(tmp, tmp);
                }
            }

        }
        len = len < map.size() ? map.size() : len;
        return len;
    }
  • 思路2:一个循环,通过HashMap存放在字符串中最大位置,通过变量和最大位置差获得结果
 public int lengthOfLongestSubstring2(String s) {
        int n = s.length(), ans = 0;
        // 存放字符在字符所在最大位置
        Map<Character, Integer> map = new HashMap<>();
        for (int j = 0, i = 0; j < n; j++) {
            if (map.containsKey(s.charAt(j))) {
                i = Math.max(map.get(s.charAt(j)), i);
            }
            ans = Math.max(ans, j - i + 1);
            map.put(s.charAt(j), j + 1);
        }
        return ans;
    }
  • 思路3:在思路2基础上变动,char字符ascii码128个,用数组代替HashMap,通过字符ascii码当作数组位置
public int lengthOfLongestSubstring3(String s) {
        int n = s.length(), ans = 0;
        //字符ascii码-数组位置,字符在字符串最大位置-值
        int[] index = new int[128];
        for (int j = 0, i = 0; j < n; j++) {
            i = Math.max(index[s.charAt(j)], i);
            ans = Math.max(ans, j - i + 1);
            index[s.charAt(j)] = j + 1;
        }
        return ans;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.字符串中的元素 2.python中可以把字符串看成是一个序列(容器),容器中内容是字符。 每一个字符可以称为字...
    烟雨旎旎阅读 1,287评论 0 0
  • 1.函数的基础: 函数的定义 定义格式:def 函数名(): 函数的调用 调用函数很简单的,通过 函数名() 即可...
    金政锐阅读 1,885评论 0 0
  • 正则 1、什么是正则表达式: 能让计算机读懂的字符串匹配规则。 2、正则表达式的写法: var re=new Re...
    金政锐阅读 838评论 0 0
  • 《草塘纪事:动物》 草塘方圆百亩,水丰草茂,多动物,组团的也多,青皮蛙,鱼虾蟹,麻鸭子,白肚蛇,浪浪地,把静静的水...
    合肥张建春阅读 2,299评论 0 0
  • 刚下飞机,行李丢了。确切的说,被偷了! 梦境起于机场,在旋转带等行李,刚刚等到自己的包裹,变伸手去提,心里一个激灵...
    留着一撇小胡子装成熟阅读 832评论 0 0