[剑指Offer]48-最长不含重复字符的子字符串(递归思想,循环实现)
题意
如题,字符串只含a-z,输出该子串长度。例:"arabcacfr",输出4。
解题思路
递归思想
- 哈希表"int lastAppear[26]":存储各字母在之前遍历过程中最近一次出现的位置。初始化-1表示该字母从未出现。
- 变量len:为以每个字符结尾的最长不含重复字符的子串长度。计i-lastIdx为当前字符出现位置和上次出现该字符的位置之差。比较这两者:
- (1) 当i-lastIdx>len (以i-1结尾),说明字符出现在len 以(i-1结尾)对应的最长子串外,所以len=len+1。
- (2) i-lastIdx<=len (以i-1结尾),说明字符出现在len (以i-1结尾)对应的最长子串中,此时说明当前字符与上次出现的该字符之间无重复字符,所以len=i-lastIdx;
- 注意每次要更新哈希表。
用循环实现。
时间复杂度O(n).
代码(C++)
#include <iostream>
#include <string>
using namespace std;
int subStrLen(string s){
if(!s.size()){
return 0;
}
int lastAppear[26];
memset(lastAppear,-1,sizeof(lastAppear));
int tempLen=0;
int maxLen=0;
for(int i=0;i<s.size();++i){
if(i==0){
tempLen=1;
}
else{
int lastIdx=lastAppear[s[i]-'a'];
if(lastIdx==-1){
tempLen+=1;
}
else if((i-lastIdx)>tempLen){
tempLen+=1;
}
else{
tempLen=i-lastIdx;
}
}
lastAppear[s[i]-'a']=i;
if(tempLen>maxLen){
maxLen=tempLen;
}
}
return maxLen;
}
int main(int argc, const char * argv[]) {
string s="arabcacfr";
int len=subStrLen(s);
cout<<len<<endl;
return 0;
}
代码(Java)
public class Main {
public static void main(String args[]) {
String str="aa";
int len=getLongestSubDisStr(str);
System.out.println(len);
}
public static int getLongestSubDisStr(String str) {
if(str==null||str=="") {
return 0;
}
int[] map=new int[256];
int maxLen=-1;
int len=0;
for(int i=0;i<map.length;++i) {
map[i]=-1;
}
for(int i=0;i<str.length();++i) {
int lastIdx=map[str.charAt(i)];
if(lastIdx==-1||(i-lastIdx)>len) {
len+=1;
}
else {
len=i-lastIdx;
}
map[str.charAt(i)]=i;
if(len>maxLen) {
maxLen=len;
}
}
return maxLen;
}
}
[剑指Offer]48-最长不含重复字符的子字符串(递归思想,循环实现)的更多相关文章
- 剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口
剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Aut ...
- 【Java】 剑指offer(48) 最长不含重复字符的子字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字 ...
- 每日一题 - 剑指 Offer 48. 最长不含重复字符的子字符串
题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 哈希表 难易程度:中等 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度 ...
- 剑指 Offer 48. 最长不含重复字符的子字符串
题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...
- 剑指offer——50最长不含重复字符和子字符串
题目: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含’a~z”的字符.例如,在字符串“arabcacfr"中,最长的不含重复字符的子字符串 ...
- 剑指offer-面试题48-最长不含重复字符的子字符串-动态规划
/* 题目: 最长不含重复字符的子字符串. */ /* 思路: f(i) = f(i-1) + 1,(未出现过当前字符,distance > f(i-1) distance,当前字符和上一次出现 ...
- 剑指offer面试题48: 最长不含重复字符的子字符串
Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...
- 《剑指offer》面试题48. 最长不含重复字符的子字符串
问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- 《剑指offer》第四十八题(最长不含重复字符的子字符串)
// 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度.假设字符串中只包含从'a'到'z'的字符. #inclu ...
- 【Offer】[48] 【最长不含重复字符的子字符串】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含'a'~'z'的字符.例如,在字符串&q ...
随机推荐
- 机器学习进阶-直方图与傅里叶变换-傅里叶变换(高低通滤波) 1.cv2.dft(进行傅里叶变化) 2.np.fft.fftshift(将低频移动到图像的中心) 3.cv2.magnitude(计算矩阵的加和平方根) 4.np.fft.ifftshift(将低频和高频移动到原来位置) 5.cv2.idft(傅里叶逆变换)
1. cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT) 进行傅里叶变化 参数说明: img表示输入的图片, cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法 ...
- Java快速开发平台——JEECG 3.7.8 版本发布!我们的目标是有鱼丸也有粗面
JEECG 3.7.8 版本发布,多样化主题UI满足你不同的需求 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板( ...
- Windows 环境变量立即生效
先进环境变量 保存一个份PATH值. 万一改错就不好了 cmd窗口中 set path=XXXXXXXX
- Bootstarp 模版网站
最佳Bootstrap模版 https://colorlib.com/wp/cat/bootstrap/ https://www.jianshu.com/p/4a116cf24a05
- $event Object angularjs
You can pass the $event object as an argument when calling the function. The $event object contains ...
- plsql和tsql常用函数比对
http://www.jb51.net/list/list_154_1.htm 数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value fro ...
- [Linux]CentOS7搭建Nginx + MySQL + PHP
------------------------------------------------------------------------------------- Nginx安装参考地址:ht ...
- angularjs 请求数据转换为Form Data传参
在angularjs中配置好服务,有时传参会导致后台借不到值或者后台直接报错: 这就与后台框架有关,如果后台是以public ModelAndView接收接口传过来的参数,这种情况,前台传参的形式比较 ...
- 7.mysql-安装和卸载.md
目录 卸载 停止window的MySQL服务. 卸载MySQL安装程序.找到"控制面板"-> "程序和功能",卸载MySQL程序. 安装 MYSQL的安装 ...
- mysql 拼接字符
Mysql的查询结果行字段拼接,可以用下面两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...