剑指offer算法题:最长不含重复字符的子字符串lengthOfLongestSubstring

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

O(n2)效率不高解法:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //a ->97
        int len;
        if(s == null || (len = s.length()) == 0)return 0;
        int[] arr = new int[128];//如果只有a-z时,空间为26就可以
        int i = 0,count = 1;//字符串不为空则最长不含重复字符的子字符串至少为1
        while(i < len) {
            int j = i;
            while(j < len) {
                int index = s.charAt(j);//映射到arr数组下标
                if(arr[index] != 0) {//重复了
                    break;
                }else {
                    arr[index] = 1;
                    j++;
                }
            }
            count = Math.max(count,j-i);
            init(arr);//初始化数组
            i++;
        }
        return count;
    }
    private void init(int[] arr) {
        for(int k = 0;k < arr.length;k++)
            arr[k] = 0;
    }
}
发布了239 篇原创文章 · 获赞 70 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43777983/article/details/104299089