• 力扣LeatCode算法题第三题-无重复字符的最长子串


    要求:

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

    我一开始采用的第一种方法是使用hashmap去比对大小,在idea上可以跑通程序,但在leatcode的编译器中,无法通过字符串s="" 和s=" "的校验,很奇怪。

    1. package com.zhm.test;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. /**
    5. * @Author bige
    6. * @Date: 2022/11/18 8:39
    7. * @ApiNote: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
    8. */
    9. public class Leatcode_test003 {
    10. public static int lengthOfLongestSubstring(String s) {
    11. //每一道算法题,先想出解题思路。
    12. //1.判空
    13. //2.思路想法。
    14. // 2.1.可以使用hashMap类型
    15. // 2.2 key作为索引下标0,1,2,3. 每个字母作为value
    16. // 2.3 循环比对所有的value,返回key. 求出key的差值大小=length。
    17. Map stringHashMap = new HashMap();
    18. int max = 0;
    19. String[] split = s.split("");
    20. for (int i = 0; i < split.length; i++) {
    21. stringHashMap.put(i,split[i]);
    22. }
    23. if(split.length<1){
    24. max=0;
    25. }else if(split.length==1){
    26. max=1;
    27. }else{
    28. for (Map.Entry entry : stringHashMap.entrySet()) {
    29. for (int j = entry.getKey()+1; j < split.length; j++) {
    30. if(entry.getValue().equals(split[j])){
    31. max=(max < (j - entry.getKey()) ) ? (max = (j - entry.getKey())) : max;
    32. break;
    33. }
    34. }
    35. }
    36. }
    37. return max;
    38. }
    39. public static void main(String[] args){
    40. String s = " ";
    41. System.out.println("max="+lengthOfLongestSubstring(s));
    42. }
    43. }

    可以在idea中输出正确的结果。

    尝试使用下第二种方法去验证。

    利用String本身的方法去进行调用和判断,利用indexOf()方法,可以进行返回首次出现的下标。

    1. public static int lengthOfLongestSubstring(String s) {
    2. int index=0;//索引
    3. int des=0;//差值
    4. for (int i = 0; i < s.length(); i++) {
    5. if(s.indexOf(s.charAt(i),index) < i){
    6. index=s.indexOf(s.charAt(i),index)+1;
    7. }else {
    8. //des=Math.max( des, i - index + 1);
    9. des=des>(i-index+1)?des :(i-index+1);
    10. }
    11. }
    12. return des;
    13. }

    代码解析:

    1.进入if的唯一条件是出现了同样的字母。

    例如测试数据:

    String s = "abcabcbb";

    首次出现:int index=0;

    再次出现:int lastIndex =3;

    但由于我们使用的IndexOf()方法,再次出现的a字母,会导致索引返回第一次出现字母a的索引index=0。 所以才能进入到if的判断语句中。

    if()方法中,+1的作用是因为每再次遇到相同字母就+1.

    比如测试数据:

    String s1 = "cacccc";

    首次c的索引=0,index=0;

    第二次遇到c的索引=2,index=1;

    第三次遇到c的索引=3,index=2;

    第三次遇到c的索引=4,index=3;

    第三次遇到c的索引=5,index=4;

    主要是防止重头开始索引,需要移动下标。

    贴上所有代码,可以在idea中进行数据测试

    1. package com.zhm.test;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. /**
    5. * @Author bige
    6. * @Date: 2022/11/18 8:39
    7. * @ApiNote: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
    8. */
    9. public class Leatcode_test003 {
    10. public static int lengthOfLongestSubstring1(String s) {
    11. //每一道算法题,先想出解题思路。
    12. //1.判空
    13. //2.思路想法。
    14. // 2.1.可以使用hashMap类型
    15. // 2.2 key作为索引下标0,1,2,3. 每个字母作为value
    16. // 2.3 循环比对所有的value,返回key. 求出key的差值大小=length。
    17. Map stringHashMap = new HashMap();
    18. int max = 0;
    19. String[] split = s.split("");
    20. for (int i = 0; i < split.length; i++) {
    21. stringHashMap.put(i,split[i]);
    22. }
    23. if(split.length<1){
    24. max=0;
    25. }else if(split.length==1){
    26. max=1;
    27. }else{
    28. for (Map.Entry entry : stringHashMap.entrySet()) {
    29. for (int j = entry.getKey()+1; j < split.length; j++) {
    30. if(entry.getValue().equals(split[j])){
    31. max=(max < (j - entry.getKey()) ) ? (max = (j - entry.getKey())) : max;
    32. break;
    33. }
    34. }
    35. }
    36. }
    37. return max;
    38. }
    39. public static int lengthOfLongestSubstring(String s) {
    40. int index=0;//索引
    41. int des=0;//差值
    42. for (int i = 0; i < s.length(); i++) {
    43. if(s.indexOf(s.charAt(i),index) < i){
    44. index=s.indexOf(s.charAt(i),index)+1;
    45. }else {
    46. //des=Math.max( des, i - index + 1);
    47. des=des>(i-index+1)?des :(i-index+1);
    48. }
    49. }
    50. return des;
    51. }
    52. public static void main(String[] args){
    53. String s = "abcabcbb";
    54. String s1 = "cccccc";
    55. System.out.println("length="+s.length());
    56. System.out.println("max="+lengthOfLongestSubstring(s));
    57. }
    58. }

  • 相关阅读:
    有哪些视频媒体?邀请视频媒体报道活动的好处
    Aapache Tomcat AJP __ 文件包含漏洞 __ CVE-2020-1938
    你需要知道的ES6—ES13开发技巧
    你应该在 Kubernetes 中运行有状态的应用程序吗?
    spring boot +springboot集成es7.9.1+canal同步到es
    提升汽车APP用户体验,火山引擎APMPlus的“独家秘笈”
    文献综述怎么写?(以利用Zotero的文献管理软件为例)
    什么是长轮询
    【消息队列】MQ02——Kafka
    视频编解码 — 卡顿与花屏
  • 原文地址:https://blog.csdn.net/feipo_zhm/article/details/127923008