zoukankan      html  css  js  c++  java
  • LeetCode题解 #3 Longest Substring Without Repeating Characters

    找出字符串中没有相同字符的的最长串

    注意这里的 Characters指的是字符,不是字母,就是说|/?~这样的字符都会出现,所以要用到ASCII码

    最简单的方法是,从第一个字符开始,往后一个个判断,里面有没有重复的字符,如果重复了则记录下长度。

    例如:abcabcbb

    第一次:abc 重复于a  长度3

    第二次:bca 重复与b  长度3

    第三次:cab 重复与c  长度3

    ......

    但这种方法很耗时

    如果是 abcdefghijk这种

    第一次就找到了的 abcdefghijk

    但还要第二次往后 bcdefghijk 第三次的cdefghijk ......

    一个改进的方法是

    也是从头往后一个个判断,但是不是头一个个的往后,而是如果有重复的字符,则找到字符串中的重复字符,以该字符的下一个字符为头开始判断。

    例如:

    abcdefgfb

    第一次的adcdefg 重复于f

    就从g开始:gfb

    因为肯定要从重复字符的后一个开始啊,前面的都包含了这个字符了,后面一定会重复的啦。

    要边判断的同时边记录大小,判断的话用一个127大小的int数组判断,如果出现过该字符,就使数组元素为1:

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            
          
            
            int head=0;
            int tail=0;
            
            int length = s.length();
            
            int max = 0;
            int temp = 0;
            
            
            while(head<length){
                
                temp = 0;
                
                int [] record = new int [127];
                
                
                
                
                
                tail=head;
                
                //如果没有出现过
                
                
                while(tail<length&&record[(int)(s.charAt(tail))]==0){
                    
                    //System.out.print(s.charAt(tail));
                    
                    record[(int)(s.charAt(tail))]=1;
                    tail++;
                    temp++;
                    
                    
                    
                    
                }
                
                //System.out.println();
                
                if(temp>max)
                    max=temp;
                
                //跳出循环 即是说已经出现了重复的字符了
                //或者已经到句末了
                if(tail>=length)
                    break;
                
                if(tail<length){
                char chongfu = s.charAt(tail);
                
                //System.out.println(chongfu+"!");
                
                //把head一直移到出现过的字符后面
                
                while(s.charAt(head)!=chongfu){
                    
                    head++;
                    
                }
                
                head++;
                
                }
                
                
            }
            
            //System.out.println(max);
            return max;
            
            
        }
    }
  • 相关阅读:
    tp5 phpstudy配置问题
    无限级分类的写法
    使用微信共众号 提供网页登陆接口
    destoon数据库表说明汇总如下
    destoon 配置文件config.inc.php参数说明
    destoon二次开发流量
    thinkphp5 模型读取器和修改器
    thinkphp5 模型的 删作操作
    thinkphp5 模型的 查询操作
    轻松搞定数据验证(三)
  • 原文地址:https://www.cnblogs.com/wzben/p/5143311.html
Copyright © 2011-2022 走看看