【贪心算法-LeetCode3:无重复字符的最长子串(Java实现)】
创始人
2024-01-18 04:09:57

无重复字符的最长子串

  • 一、题目描述
    • 1.题目内容
    • 2.样例
  • 二、解决方案
    • 1.算法流程
    • 1)分析
  • 2)算法流程
    • 2.Java代码
    • 1)核心代码
    • 2)完整测试代码

个人社区:https://bbs.csdn.net/forums/smile
个人主页:https://blog.csdn.net/qq_43665602
欢迎各位志同道合的朋友,一起学习!

一、题目描述

1.题目内容

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

2.样例

在这里插入图片描述

二、解决方案

看见这种求最优解的问题,可以尝试使用贪心算法,尤其对于集合覆盖问题、区间问题以及分配问题。

贪心算法:求局部最优(当前最优),以使最终结果为最优解或者近似最优解。

本题目的是求出给定字符串S中不含重复字符的最长子串,很自然地可以想到,我们可以通过逐步求解当前无重复最长子串,最后得到字符串S中不含重复字符的最长子串。
需要注意子串必须是连续的,要与子序列区分。

1.算法流程

1)分析

以样例1和样例2为例,我通过图解分析一下求解无重复字符最长子串的过程:
样例1,S=“abcabcbb”,从字符串开头开始分别以当前字符为起点,确定此时的无重复字符的最长子串:
(1)i=0:起点为a,最长子串为abc,长度为3;
(2)i=1:起点为b,最长子串为bca,长度为3;
(3)i=2:起点为c,最长子串为cab,长度为3;
(4)i=3:起点为a,最长子串为abc,长度为3;
(5)i=4:起点为b,最长子串为bc,长度为2;
(6)i=5:起点为c,最长子串为cb,长度为2;
(7)i=6:起点为b,最长子串为b,长度为1;
(8)i=7:起点为b,最长子串为b,长度为1;
可看到第一次确定的子串长度为3,此后子串长度均小于等于3,所以最长子串为abc,其长度为3。
在这里插入图片描述
样例2,S=“pwwkew”,从字符串开头开始分别以当前字符为起点,确定此时的无重复字符的最长子串:
(1)i=0:起点为p,最长子串为pw,长度为2;
(2)i=1:起点为w,最长子串为w,长度为1;
(3)i=2:起点为w,最长子串为wke,长度为3;
(4)i=3:起点为k,最长子串为kew,长度为3;
(5)i=4:起点为e,最长子串为ew,长度为2;
(6)i=5:起点为w,最长子串为w,长度为1;
在这里插入图片描述

可看到第三次确定的子串长度为3,此后子串长度均小于等于3,所以最长子串为wke,其长度为3。
从上面的图示中可以清晰看到最长子串的确定过程,由此可归纳出我们的算法流程,便于代码编写。

2)算法流程

选择策略:确定当前最长无重复子串,遇到重复字符即说明可确定当前最长无重复子串.

  • (1)依次遍历字符串,使用集合存储每个元素(这里使用HashSet);
  • (2)如果集合中存在当前指向的字符,说明有重复:比较此时maxLen与set.size的大小决定是否更新maxLen;
  • (3)循环(1-2),如果遇到更长子串,则更新maxLen; 如果剩余子串长度小于等于maxLen则停止遍历;

需要注意特殊情况:如果字符串为空串或者其长度为1,说明其最长无重复子串为其本身。

2.Java代码

1)核心代码

class Solution {/*** 选择策略:当前最长无重复子串,遇到重复字符就重置*/public int lengthOfLongestSubstring(String s) {if (s.length()<=1){  // 如果字符串为空串或者其长度为1,说明其最长无重复子串为其本身return s.length();}int n=s.length();Set withoutRepeat=new HashSet<>();  // 存储当前子串int i=0,maxLen=0;while (i  // 依次遍历每个字符withoutRepeat.clear();  // 存储新的子串需要重置Setint j=i; while (j // 寻找当前字符开始的最长子串if(withoutRepeat.contains(s.charAt(j))){  // 遇到重复字符就停止寻找break;}withoutRepeat.add(s.charAt(j));j++;}if((j-i+1)>maxLen){  // 确定是否更新maxLen,j-i+1为当前子串长度maxLen=j-i;}if (maxLen>=(n-i+1)){ // 如果剩余子串长度小于等于maxLen则停止遍历break;}i++;}return maxLen;}
}

2)完整测试代码

import java.util.HashSet;
import java.util.Set;/*** LeetCode3:无重复字符的最长子串*/
public class WithoutRepeat {public static void main(String[] args) {String s = "abcabcbb";
//        String s = "bbbbbb";
//        String s = "pwwkew";
//        String s = "au";System.out.println(new RepeatSolution().lengthOfLongestSubstring(s));}
}class RepeatSolution {/*** 选择策略:当前最长无重复子串,遇到重复字符就重置* @param s* @return*/public int lengthOfLongestSubstring(String s) {if (s.length()<=1){return s.length();}int n=s.length();Set withoutRepeat=new HashSet<>();int i=0,maxLen=0;while (i  // 依次遍历每个字符withoutRepeat.clear();int j=i;  // 寻找当前字符开始的最长子串while (jif(withoutRepeat.contains(s.charAt(j))){break;}withoutRepeat.add(s.charAt(j));j++;}if((j-i+1)>maxLen){maxLen=j-i;}if (maxLen>=(n-i+1)){break;}i++;}return maxLen;}
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
苁蓉的食用方法 鲜苁蓉的吃法有... 肉苁蓉号称“温而不热,补而不峻,暖而不燥,滑而不泄,故有从容之名。”历来也是传统药食同源的滋补佳品。...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
阳澄湖在哪里哪个省的 阳澄湖是... 点击题目下方苏州生活指南有用 有趣 有态度近期的阳澄湖度很高,3月24日,央视二套《第一时间》直播连...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...