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;
        }
    }
     
  • 相关阅读:
    第四百零三节,python网站在线支付,支付宝接口集成与远程调试,
    第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置
    第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1
    第四百零一节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署virtualenv虚拟环境安装,与Python虚拟环境批量安装模块
    中间件
    django自定义分页器组件
    Form组件
    前端之CSS重点知识
    group by 和where
    关于update和alter
  • 原文地址:https://www.cnblogs.com/manmanchanglu/p/12372752.html
Copyright © 2011-2022 走看看