LeetCode 热题 HOT 100-无重复字符的最长子串

文章目录

  • LeetCode 热题 HOT 100题
    • 无重复字符的最长子串 题目
    • JAVA实现代码
    • 题目分析
    • 总结
    • 附String类常用方法


LeetCode 热题 HOT 100题

前言

个人愚笨,在看题的时候一脸懵逼,开始写代码也写的好复杂,后来冷静下来分析了分析,然后参考了评论区某大神的便利写法,找到了规律,感觉自己动手写出来才OK,然后就在原来自己写的复杂代码上变了一种写法,从int数组变成了List集合,集合真心比数组好用,不过还是要经常动手不然好多基础理论性的东西都忘完了,太依赖现在的框架和自动填充了,地基稳楼才稳,长心了。

无重复字符的最长子串 题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
==请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。==
示例 4:
输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

JAVA实现代码

  1. 我写的:
执行结果:通过
显示详情
执行用时:4 ms
内存消耗:38.7 MB
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        if(s!= null && !"".equals(s) ){
            int res = 0;
            List TempList = new ArrayList();
            for(int i = 0; i < n; i++) {
                int index = s.charAt(i);
                for(int j = 0; j < TempList.size(); j++) {
                    if(TempList.get(j) == index){
                        int t = j;
                        while(t >= 0){
                            TempList.remove(t);
                            t--;
                        }
                        break;
                    }
                }
                TempList.add(index);
                for(int q = 0; q < TempList.size(); q++){
                    System.out.print(((char)TempList.get(q).intValue()) + ",");
                }
                System.out.println();
                res = Math.max(res,TempList.size());
            }
            return res;
        }
        return 0;        
    }
}
  1. 某大神写的
执行用时: 2 ms
内存消耗: 38.8 MB
class Solution {
    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;
    }

}

题目分析

  • 题目分析
    首先分析题目:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
    • 示例 1:
      输入: s = “pwwkew”
      输出: 3
      解释: 因为无重复字符的最长子串是 “wke”、“kew”,所以其长度为 3。
  • 代码分析
    • 开始定义一个集合或者数组从左至右存储不相同的顺序字节
       List TempList = new ArrayList();
      
    • 通过每次判断集合或者数组中存放的值来与字符串中当前字节作比较,如果比较的值相同则移除集合中所有这个字节之前包括这个字节,当然这里就比较坑了,数组的话要向前覆盖,总之不好用,所以这里我选择用了List集合,记录相同值在集合的下标,然后循环下标自减,小于0的时候退出,循环体内容就是移除List集合的方法,如下:
         for(int j = 0; j < TempList.size(); j++) {
              if(TempList.get(j) == index){
                   int t = j;
                   while(t >= 0){
                       TempList.remove(t);
                       t--;
                   }
                   break;
               }
         }
         ```
      
    • 然后移除完毕之后,在把当前从字符串取出来的字节存放到List集合中去,然后取两个数的最大值赋值给返回的变量res
      TempList.add(index);  // 当前从字符串取出来的字节存放到List集合
      res = Math.max(res,TempList.size());  //取 集合的size 、res数量 两个中的最大值
      

LeetCode 热题 HOT 100-无重复字符的最长子串_第1张图片

总结

到这就完结了,如上图可以看出,我这个程序还输出了集合中存储字符串不重复的字串,这个程序又可以完成不重复的最长字串和长度,当然完成这个功能程序还需要改造一下,有兴趣的小伙伴可以试试,当然我这个程序也不是最优的,我还需要自己去写最优的方法,算法主要是理解怎么可以实现,是一个公式,实现方法却有好多。这个题也用到了许多String类的基础知识,我开始做的时候就因为好多方法不常用有点生疏了,所以我把String类常用的方法也附到下面,会的相当于温习一下,不会的看一下,忘了的可以在记一下。最后,欢迎各路大神来讨论和批评!

附String类常用方法

String常用方法转载:https://blog.csdn.net/qq_43573190/article/details/88957004

  • 用字符数组value创建一个String对象
    • 实例:
    	char[] value ={"a","b","c","d"};
    	String str = new String(value);
    	//相当于String str = newString("abcd")
    
  • 用字符数组以x开始的n个字符创建一个String对象
    • 实例:
    	char[] value ={"a","b","c","d"};
    	String str = new String(value, 1, 2);
    	//相当于String str = newString("bc");
    
  • 获取字符串长度
    • 实例:
    	String str = new String("478bhjd56");
    	int strlength = str.length();
    
  • 获取字符串某一位置的字符
    • 实例:
    	String str = new String("43dfzyd");
    	char ch = str.charAt(4);//ch = z
    
  • 获取字符串的子串
    • 实例:
    	String str1 = newString("asdfzxc");
    	String str2 = str1.substring(2);//str2 ="dfzxc"
    	String str3 = str1.substring(2,5);//str3 ="dfz"
    
  • 字符串中字符的大小写转换
    • 实例
    	//返回将当前字符串中所有字符转换成小写后的新串
    	public String toLowerCase()
    	//返回将当前字符串中所有字符转换成大写后的新串
    	public String toUpperCase()
    	String str = new String("JavaStudy");
    	String str1 = str.toLowerCase();
    	//str1 = "javastudy"
    	String str2 = str.toUpperCase();
    	//str2 = "JAVASTUDY"
    
  • 去空格
    • 实例:
    	String str = " z dali ";
    	String str1 = str.trim();
    	int a = str.length();//a = 8
    	int b = str1.length();//b = 6
    	System.out.println(a+"\n"+b);
    
  • 基本类型转换为字符串
    • 实例:
    	String s1 = String.valueOf(12.99);
    	System.out.println(s1);
    	//double类型转string类型
    
  • 将字符串分割成字符串数组
    • 实例
    	String str = "sgs#jkc#eer";
    	String[] str1 = str.split("#");
    	for (int i = 0; i < str1.length; i++) {
    	  System.out.println(str1[i]);  
    	  //输出结果是sgs jkc eer
    }
    

你可能感兴趣的:(leetCode算法类,字符串,python,算法,leetcode,java)