zoukankan      html  css  js  c++  java
  • 2.无重复字符的最长子串

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int l=1;
            int change=1;
            int r=1;
            char [] q=s.toCharArray();//字符串转换成字符数组
            for(int i=0;i<s.length()-1;i++){
                for(int j=i+1;j<=s.length()-1;j++){
                    int m=j-1;
                    while(m>=i){
                        if(q[j]!=q[m]){
                            m--;
                            change++;
                        }
                        else {
                            r=0;
                            break;
                        }
                                               
                              }
                    if(change>l)
                        l=change;
                    
                    change=1;
                    if(r==0)
                        break;
                   
                }
                r=1;
            }
            return l;
    
        }
    }

    1.程序中用到的转换知识

    //1.字符数组转换成字符串
    //(1)直接在构造String时转换
    char[] array = new char[] {'a','b','c','d','e','f','g'};        
    String str = new String(array);        
    System.out.println(str);                
    //(2)调用String类的提供的方法的valueOf()        
    String str2 = String.valueOf(array);        
    System.out.println(str2);                
    //2.字符串  转换成 字符数组         
    //(1)调用String类的提供的方法的toCharArray()        
    String msg = "i am a good boy!";        
    char[] dest = msg.toCharArray();        
    System.out.println(Arrays.toString(dest));

     2.获取字符串的长度

    String s="qwer";
    int b=s.length();
    //获取字符串中的第j个字符
    s.charAt(j)

    3.官方题解

    滑动窗口
    算法
    暴力法非常简单,但它太慢了。那么我们该如何优化它呢?
    在暴力法中,我们会反复检查一个子字符串是否含有有重复的字符,但这是没有必要的。如果从索引 iii 到 j−1j - 1j−1 之间的子字符串 sijs_{ij}sij​ 已经被检查为没有重复字符。我们只需要检查 s[j]s[j]s[j] 对应的字符是否已经存在于子字符串 sijs_{ij}sij​ 中。
    要检查一个字符是否已经在子字符串中,我们可以检查整个子字符串,这将产生一个复杂度为 O(n2)O(n^2)O(n2) 的算法,但我们可以做得更好。
    通过使用 HashSet 作为滑动窗口,我们可以用 O(1)O(1)O(1) 的时间来完成对字符是否在当前的子字符串中的检查。
    滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i,j)[i, j)[i,j)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 [i,j)[i, j)[i,j) 向右滑动 111 个元素,则它将变为 [i+1,j+1)[i+1, j+1)[i+1,j+1)(左闭,右开)。
    回到我们的问题,我们使用 HashSet 将字符存储在当前窗口 [i,j)[i, j)[i,j)(最初 j=ij = ij=i)中。 然后我们向右侧滑动索引 jjj,如果它不在 HashSet 中,我们会继续滑动 jjj。直到 s[j] 已经存在于 HashSet 中。此时,我们找到的没有重复字符的最长子字符串将会以索引 iii 开头。如果我们对所有的 iii 这样做,就可以得到答案。
    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            int n = s.length();
            Set<Character> set = new HashSet<>();
            int ans = 0, i = 0, j = 0;
            while (i < n && j < n) {
                // try to extend the range [i, j]
                if (!set.contains(s.charAt(j))){
                    set.add(s.charAt(j++));
                    ans = Math.max(ans, j - i);
                }
                else {
                    set.remove(s.charAt(i++));
                }
            }
            return ans;
        }
    }
     
  • 相关阅读:
    node
    github
    [模块] pdf转图片-pdf2image
    python 15 自定义模块 随机数 时间模块
    python 14 装饰器
    python 13 内置函数II 匿名函数 闭包
    python 12 生成器 列表推导式 内置函数I
    python 11 函数名 迭代器
    python 10 形参角度 名称空间 加载顺序
    python 09 函数参数初识
  • 原文地址:https://www.cnblogs.com/manmanchanglu/p/12372752.html
Copyright © 2011-2022 走看看