合并两个有序数组

153 阅读1分钟

合并两个有序数组

说明

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
  • 提示:

    • 0 <= s.length <= 5 * 104
    • s 由英文字母、数字、符号和空格组成

来源:力扣(LeetCode) 链接:leetcode.cn/problems/lo…

题解

解法一

    public static void main(String[] args) {
        System.out.println(demo("abcabcbb"));
    }
​
    public static  int demo(String s){
        int sum = 0;
        String[] split = s.split("");
        StringBuilder str = new StringBuilder(split[0]);
        for (int i = 1; i < split.length; i++) {
            int indexOf = str.indexOf(split[i]);
            if(!"".contentEquals(str) &&  indexOf != -1){
                if(sum < str.length()){
                    sum = str.length();
                }
                str = new StringBuilder(str.substring(indexOf + 1,str.length()));
            }
            str.append(split[i]);
        }
        if(sum < str.length()){
            sum = str.length();
        }
        return sum;
    }
​

解法二

力扣大佬的解法

    public int lengthOfLongestSubstring(String s) {
        // 记录字符上一次出现的位置
        int[] last = new int[128];
        for(int i = 0; i < 128; i++) {
            last[i] = -1;
        }
        int n = s.length();
​
        int res = 0;
        int start = 0; // 窗口开始位置
        for(int i = 0; i < n; i++) {
            int index = s.charAt(i);
            start = Math.max(start, last[index] + 1);
            res   = Math.max(res, i - start + 1);
            last[index] = i;
        }
        return res;
    }

\