个人随笔
目录
leetcode(一)、无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
2021-06-15 18:34:31

子串:原序列中必须连续的一段
子序列:原序列中可以不连续的一段
注意:无论是子串和子序列,元素的顺序都是原序列中的顺序 注意:无论是子串和子序列,元素的顺序都是原序列中的顺序

  • 示例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 * 10^4 s由英文字母、数字、符号和空格组成
  1. public class Test3 {
  2. public static void main(String[] args) {
  3. String str = "asdf234234fdgbv";
  4. System.out.println(lengthOfLongestSubstring(str));
  5. System.out.println(lengthOfLongestSubstring2(str));
  6. System.out.println(lengthOfLongestSubstring3(str));
  7. }
  8. /**
  9. * 实现方式1:遍历每一个字符串,检查从当前字符串后的字符开始是否跟前面的字符串相同,若相同则不属于子串
  10. * 否在属于子串,缺点:使用的是list来保存子串,然后检查是否再list里面时间复杂度要用O(N),所以很慢
  11. * 执行用时:1412 ms, 在所有 Java 提交中击败了5.01%的用户 内存消耗:39.4 MB, 在所有 Java 提交中击败了5.08%的用户
  12. * @param str
  13. * @return
  14. */
  15. public static int lengthOfLongestSubstring(String str) {
  16. // 用最傻的方法先实现,遍历每个字母开始的最长字串
  17. int maxLen = 0;
  18. // 定义一个数组来存贮从某一个字符开始的最长子串
  19. String maxStr = "";
  20. if (str.length() <= 0) {
  21. maxLen = 0;
  22. } else {
  23. List<String> strs = new ArrayList<String>();
  24. for (int i = 0; i < str.length(); i++) {
  25. // 先获取第一个字符的最长字串
  26. // 获取当前要判断的字符
  27. char now = str.charAt(i);
  28. strs.add(now + "");
  29. for (int j = i + 1; j < str.length(); j++) {
  30. // 判断跟前面的是否重复
  31. char n = str.charAt(j);
  32. // 判断n是否在之前的序列里
  33. boolean flag = strs.contains(n + "");
  34. if (!flag) {
  35. System.out.println(n + "属于以" + now + "开头的最长字串");
  36. strs.add(n + "");
  37. } else {
  38. System.out.println(n + "不属于以" + now + "开头的最长字串");
  39. break;
  40. }
  41. }
  42. System.out.println("以" + now + "开通要的最长子序列为" + strs.toString());
  43. if (strs.size() > maxLen) {
  44. maxLen = strs.size();
  45. maxStr = strs.toString();
  46. }
  47. strs.clear();
  48. }
  49. System.out.println(str + "的最长字串为" + maxStr + "长度为" + maxLen);
  50. }
  51. return maxLen;
  52. }
  53. /**
  54. * 实现方式2:遍历每一个字符串,检查从当前字符串后的字符开始是否跟前面的字符串相同,若相同则不属于子串
  55. * 否在属于子串,改为用map来存放是否在子串中,所以比第一种好一点,但是还是很慢
  56. * 执行用时:执行用时:247 ms, 在所有 Java 提交中击败了5.74%的用户内存消耗:39 MB, 在所有 Java 提交中击败了17.15%的用户
  57. * @param str
  58. * @return
  59. */
  60. public static int lengthOfLongestSubstring2(String str) {
  61. // 用最傻的方法先实现,遍历每个字母开始的最长字串
  62. int maxLen = 0;
  63. // 定义一个数组来存贮从某一个字符开始的最长子串
  64. Map<String,Boolean> map = new HashMap<String,Boolean>();
  65. for (int i = 0; i < str.length(); i++) {
  66. // 先获取第一个字符的最长字串
  67. // 获取当前要判断的字符
  68. char now = str.charAt(i);
  69. //这里直接借助map来判断是否存在
  70. map.put(now+"", true);
  71. int len=1;
  72. for (int j = i + 1; j < str.length(); j++) {
  73. // 判断跟前面的是否重复
  74. char n = str.charAt(j);
  75. // 判断n是否在之前的序列里
  76. if(map.get(n+"")!=null) {
  77. System.out.println(n + "不属于以" + now + "开头的最长字串");
  78. break;
  79. } else {
  80. System.out.println(n + "属于以" + now + "开头的最长字串");
  81. map.put(n+"", true);
  82. len++;
  83. }
  84. }
  85. if (len > maxLen) {
  86. maxLen =len;
  87. }
  88. System.out.println("以" + now + "开头的字符串maxlen="+maxLen);
  89. map.clear();
  90. }
  91. return maxLen;
  92. }
  93. /**
  94. * 实现方式3:遍历每一个字符串,检查从当前字符串后的字符开始是否跟前面的字符串相同,若相同则不属于子串
  95. * 否在属于子串,改为用map来存放是否在子串中,并且如果判断当前字符不属于前一个子串,则字节从前一个冲突的子串的下一位开始判断,这样
  96. * 就不用重复判断长度不可能大于当前子串的内容了,比如串“abcdefcg”,我们先判断以a开头的子串,当判断到“abcdefc”的时候,c跟前面的c
  97. * 冲突,此时就没有必要判断b和第三个c开头的子串了,直接从d开始即可,节省时间。但还还是不够理想,才7.28%。
  98. * 执行用时:164 ms, 在所有 Java 提交中击败了7.28%的用户内存消耗:39 MB, 在所有 Java 提交中击败了16.36%的用户
  99. * @param str
  100. * @return
  101. */
  102. public static int lengthOfLongestSubstring3(String str) {
  103. // 用最傻的方法先实现,遍历每个字母开始的最长字串
  104. int maxLen = 0;
  105. // 定义一个数组来存贮从某一个字符开始的最长子串
  106. Map<String,Integer> map = new HashMap<String,Integer>();
  107. int now_j=0;
  108. for (int i = 0; i < str.length();) {
  109. // 先获取第一个字符的最长字串
  110. //获取i~now_j之间的字符串
  111. String ss = str.substring(i, now_j+1);
  112. int len=ss.length();
  113. for (int j = 0; j <ss.length(); j++) {
  114. map.put(ss.charAt(j)+"", i+j);
  115. }
  116. //冲突的下标
  117. Integer n_index=now_j+1;
  118. for (int j = now_j+1; j < str.length(); j++) {
  119. // 判断跟前面的是否重复
  120. char n = str.charAt(j);
  121. // 判断n是否在之前的序列里
  122. n_index = map.get(n+"");
  123. now_j=j;
  124. if(n_index!=null) {
  125. //这里表示当前的j和n_index,那下一次循环就可以直接把n_index~j之间的内容
  126. break;
  127. } else {
  128. n_index=j;
  129. map.put(n+"", j);
  130. len++;
  131. }
  132. }
  133. if (len > maxLen) {
  134. maxLen =len;
  135. }
  136. map.clear();
  137. i=n_index+1;
  138. }
  139. return maxLen;
  140. }
  141. }

上面是我自己的解题方法,超过的人太少了,丢人!

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

 245

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2