java 最长不重复子串,最长无重复字符子串
正文在下面,先打个广告:
问题描述:
输入:abdca 返回:abdc
方法一:使用双指针(滑动窗口)来实现。该方法需要配合map保存已经出现过的字符。
public static int maxLength(String nums, int begin, int end, int maxStr){if (null == nums || nums.length() == 0) return 0;if (end>=nums.length()) return maxStr;Map<Character, Integer> map = new HashMap<>();for (int i = begin; i <= nums.length()-1 ; i++) {if (null == map.get(nums.charAt(i))) {map.put(nums.charAt(i), i);if(map.size() > maxStr){maxStr = map.size();}} else {begin = map.get(nums.charAt(i)) + 1;break;}}return maxLength(nums, begin, end+1, maxStr);}
public static void main(String[] args) {System.out.println(maxLength("arabcacfr",0,1,1));System.out.println(maxLength("aababcbcd",0,1,1));System.out.println(maxLength("ccccc",0,1,1));System.out.println(maxLength("",0,1,1));System.out.println(maxLength("c",0,1,1));System.out.println(maxLength("ac",0,1,1));System.out.println(maxLength(null,0,1,1));
}
测试结果:
4
3
1
0
1
2
0
方法二:使用动态规划,记录当前字符之前的最长非重复子字符串长度f(i-1),其中i为当前字符的位置。每次遍历当前字符时,分两种情况:
1)若当前字符第一次出现,则最长非重复子字符串长度f(i) = f(i-1)+1。
2)若当前字符不是第一次出现,则首先计算当前字符与它上次出现位置之间的距离d。若d大于f(i-1),即说明前一个非重复子字符串中没有包含当前字符,则可以添加当前字符到前一个非重复子字符串中,所以,f(i) = f(i-1)+1。若d小于或等于f(i-1),即说明前一个非重复子字符串中已经包含当前字符,则不可以添加当前字符,所以,f(i) = d。
关键点: 动态规划,两个重复字符的距离
public static int maxLength(String str) {if(str==null || str.equals(""))return 0;int maxLength=0;int curLength=0;int[] position = new int[26];for(int i=0;i<position.length;i++) {position[i]=-1; //初始化为-1,负数表示没出现过}for(int i=0;i<str.length();i++) {int prevIndex = position[str.charAt(i)-'a'];int distance=i-prevIndex;//如果当前字符没有出现过,或者出现后的d大于当前最长字串长度if(prevIndex<0 || distance>curLength)curLength++;else { //如果d<=当前最长字串长度,说明两个相同字符在最长字串中if(curLength > maxLength)maxLength = curLength;curLength = distance;}position[str.charAt(i)-'a'] = i; //更新当前字符出现的位置}if(curLength>maxLength)maxLength=curLength;return maxLength;}
java 最长不重复子串,最长无重复字符子串相关推荐
- python最长连续子串_LeetCode 03无重复字符的最长子串(滑动窗口)
关注.在看,回复进群打卡 题目描述 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为 ...
- 无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 `"abc ...
- Java:判断一个字符串中是否存在另一个字符子串以及判断一个字符串中是否存在指定字符
Java:判断一个字符串中包含指定字符子串,判断一个字符串中存在指定字符 字符串的contains方法可以判断一个字符串中是否存在另一个字符子串,示例如下 String Str = "Hel ...
- java C++ 实现 leetcode 第三题 3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
一.C++实现 int lengthOfLongestSubstring(string s) {if (s.length() <= 1)return s.length();int res = 1 ...
- php无重复字符的最长子串,PHP算法之无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- 常考数据结构与算法:找到字符串的最长无重复字符子串
题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...
- 牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案
牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案 题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 题解: i和j两个指针分别指不重复子 ...
- 有序有重复、有序无重复、无序无重复、无序有重复区别详解及Python实现
这几个概念理解起来有点困难,然而他们是整个概率论的基础.理解了他们的四个的区别,对于理解高阶概率论很有帮助. 本文是在学习Vamei 概率论01 计数 基础上得到的. 概率论的基础 大数定律(伯努利) ...
- 刷题练习记录(3)——无重复字符的最长子串(JAVA 和 Python)——set()函数/集合...
[题号003]无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的 ...
- JAVA窗口sin值_大厂经典笔试题—LeetCode03无重复字符的最长子串(滑动窗口)
题目描述 原创作者:bigsai,长期维护不易,如有收获还请点赞.收藏支持! 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabc ...
最新文章
- YOLO、SSD、FPN、Mask-RCNN检测模型对比
- Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase
- 【心灵鸡汤】高情商者的15个表现
- proteus三输入与非门名字_Proteus仿真库元件名大全
- java中直角三角形第三条边,Java编程,根据输入三角形的三个边边长,程序能判断三角形类型为:等边、等腰、斜角、直角三角形,求代码...
- Node.js「四」—— 路由 / EJS 模板引擎 / GET 和 POST
- 电脑开机出现奇怪字符_电脑开机出现Reboot and select proper boot device几种解决措施...
- HTML5开发手机项目总结
- 中国人工智能人才培养白皮书
- 新入手了台IBM Thinkpad T60笔记本 重装系统
- 如何修改CryEngine5.5着色器
- 人工消雾的方法有哪些?
- QQ邮箱测试域用户密码过期邮件提示
- Avira Free Antivirus 小红伞免费杀毒软件广告去除工具
- 利用wangEditor富文本上传图片及文本并回显
- 戴尔服务器ghost系统安装教程,戴尔台式机重装系统教程
- 博弈论matlab程序,基于博弈论的频谱分配的matlab程序
- UVa 10507 - Waking up brain
- 免费搭建自己的外网可访问服务器
- Windows Vista 与 Windows Seven 回顾