原题:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc". For "bbbbb" the longest substring is "b".
思路:
可以顺序遍历字符串,并将字符出现的位置记录到一个hash表中。假设遍历到字符i,发现之前有重复的字符(但要在当前最子字符串的范围内,比如tmmzuxt,第二个 t 就不会和第一个 t 重复),可以从hash表中获取之前重复字符的位置p,那么字符串i可以和p后面的字符串组成新的子字符串(即当前子字符串),持续这个过程知道遍历完整个字符串,并记录期间出现过的最长的字符串。
由于是字符,但要存储位置,所以可以采用一个int型长度为128的数组来代替hash表。
代码如下:
public static void lengthOfLongestSubstring(String s){
//表示asc码位置。
int[] hash = new int[128];
//最长无重复子字符串的起始位置
int lcStart = 0;
//最长无重复子字符串的长度。
int lcLen = 0;
//当前无重复字符串的其实位置。
int clcStart = 0;
int len = s.length();
for(int i=0;i<len;i++){
char c = s.charAt(i);
int index = hash[c];
hash[c] = i + 1;
if(index > 0 && index > clcStart){
clcStart = index;
}else{
int clen = (i + 1) - clcStart;
if(clen > lcLen){
lcLen = clen;
lcStart = clcStart;
}
}
}
System.out.println("start=" + lcStart + ",len=" + lcLen);
System.out.println("LSWRC of ["+s+"] is ["+s.substring(lcStart, lcStart+lcLen)+"]");
}
分享到:
相关推荐
本篇文章主要探讨了如何在给定的字符串中找到最长的重复子串。例如,在字符串 "t1t1" 中,最长重复子串为 "t1";而在 "cabcabca" 中,最长重复子串可以是 "cab"、"abc" 或者 "bca"。 #### 技术实现思路 为了找到...
例如,可能需要实现一个高效的算法来判断两个字符串是否互为旋转字符串(一个字符串可以通过将另一字符串的某个部分移动到开头形成)或者找出字符串中最长的回文子串等。 接下来,关于字符串操作的常见方法。在...
在JavaScript编程中,找最大不重复子串是一个常见的字符串处理问题,主要涉及到算法设计和字符串操作。这个问题的目标是找到一个字符串中的最长子串,这个子串中的字符都不重复。这在许多实际应用中都有用到,例如...
如何实现找出长度最长的子串 充分掌握循环、条件判断、变量、自定义积木和列表操作相关积木的使用 详细解题思路和步骤可以查看博客: https://scratch.blog.csdn.net/article/details/135215226 小兔子编程给小朋友...
给定一个字符串s,找出其中不含有重复字符的最长子串的长度。例如,字符串"abcabcbb"的最长子串是"abc",其长度为3。字符串"pwwkew"的最长子串是"wke",长度为3,尽管它比"pwwkew"本身要短。 解决方案: 这个问题...
- 解决如何从一个数组中找出最小的k个数的问题。 - 涉及不同算法的选择和比较。 - **第四章:现场编写类似strstr/strcpy/strpbrk的函数** - 分析标准库函数的工作原理。 - 提供现场编写这些函数的指导和注意事项...
初始化dp数组的第一行和第一列都是从0到对应字符串的长度,因为一个空字符串的最长公共子序列长度为0。 接下来,我们可以遍历s1和s2的每个字符,如果s1[i-1]等于s2[j-1],那么dp[i][j] = dp[i-1][j-1] + 1,因为这...
- **无重复字符的最长子串**:此题考察的是滑动窗口技术,目的是寻找一个给定字符串中没有重复字符的最长子串长度。解决这个问题的关键在于如何高效地维护一个不含重复字符的子串,通常会用到哈希表来记录字符及其...
### ACM编程题模板和各种经典算法数据结构实现代码解析 #### 概述 这份文档源自吉林大学ACM/ICPC团队,旨在为学习ACM竞赛的学生提供一系列算法和数据结构的实现代码。文档包含了多种算法及其应用实例,覆盖了图论...
要求考生编写程序,给定一个整数序列,找出序列中最长的上升子序列的长度。时间限制是11000毫秒,内存限制是65536KB。考生需要理解如何通过动态规划方法存储每个位置的最长上升子序列长度,从而避免重复计算。 试题...
**解题思路**:可以使用动态规划的方法,定义一个二维数组 `dp[i][j]` 表示字符串1的前i个字符和字符串2的前j个字符的最长公共子序列的长度。 ### 第57题:基于栈的队列实现 **题目描述**:利用两个栈实现一个队列...
- **数组中的第一个不重复的数字(First Missing Positive)**: 找出数组中缺失的第一个正数。 #### 排序算法 - **合并排序数组(Merge Sorted Array)**: 将两个排序数组合并成一个新的排序数组。 - **寻找数组中的中...
- Longest Common Prefix: 找出一个字符串数组中所有字符串的最长公共前缀。 - 3Sum / 3Sum Closest / 4Sum: 这些题目都涉及到在数组中寻找具有特定和的数字组合,这通常需要用到双指针技术。 - Remove Nth Node ...
在这个场景中,我们关注的是“最长公共子序列”问题,这是计算机科学领域的一个经典问题,尤其是在字符串处理和序列比对中有着广泛的应用。 最长公共子序列是指在两个给定的序列X和Y中,存在一个序列Z,它是X的子...
这个问题涉及到字符串处理和动态规划,可能需要找出两个字符串之间的最长公共子序列或最长重复子串。具体实现通常涉及两个字符串的逐字符比较,记录最长子串的长度和起始位置。 6. **字符串转换为整数**: 在C/...
12. **字符串连接**:使用 `join()` 方法可以将一个字符列表连接成一个字符串,例如 `''.join(list('helloworld!'))` 的结果为 `'helloworld!'`。 13. **转义字符**:`\n` 表示换行符,在字符串中使用它可以实现...
2、利用二叉搜索树实现一个音像商店(小型书店、小型超市、或小型药店)的交易管理系统,要求实现以下功能: a. 该系统应该有一个字符型的主菜单; b. 能按字母顺序显示库存商品的名称和数量; c. 能添加...
20. 查找字符串数组中的最长公共前缀:一个常见的字符串数组处理问题,可以通过逐个字符比较的方式求解。 21. 字符串前导零填充问题:通常涉及到字符串和数字的转换。 22. 单词首字母大写问题:涉及到字符串遍历和...