[剑指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 ...
随机推荐
- 深度学习原理与框架-卷积神经网络-cifar10分类(图片分类代码) 1.数据读入 2.模型构建 3.模型参数训练
卷积神经网络:下面要说的这个网络,由下面三层所组成 卷积网络:卷积层 + 激活层relu+ 池化层max_pool组成 神经网络:线性变化 + 激活层relu 神经网络: 线性变化(获得得分值) 代码 ...
- 我要带徒弟学写JAVA架构,引路架构师之路(Jeecg开源社区)
带徒弟学JAVA架构(Jeecg社区) Java程序员如何打破工作2,3年的瓶颈问题,如何更上一层楼? 太多的巧合,让我接触到了开源,通过JEECG与很多朋友交流后,让我有了帮助别 ...
- Oracle函数使用
数据格式化截取: Trunc(data,[yyyy]) oracle的特有if判断: decode(sex, 0, '男', 1, '女') 分组排序:row_number() over(parti ...
- BBS-基于用户认证组建和Ajax实现登陆验证
功能1: 基于用户认证组件和Ajax实现登录验证(图片验证码) 总结: 1 一次请求伴随多次请求 2 PIL 3 session存储 4 验证码刷新 步骤: 1.配置静态文件夹 settings.py ...
- js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)【转载】
我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=> ...
- vscode项目配置 vue-loader-webpack
使用vsCode进行项目配置 一.准备工作 1.下载Visual Studio Code 下载地址 2.打开vscode,根据自己需求下载相应插件,可以提高工作效率. 点击下角选项(我作了红框标记), ...
- MVC part3
SpringMVC原理图 SpringMVC接口解释 DispatcherServlet接口: Spring提供的前端控制器,所有的请求都有经过它来统一分发.在DispatcherServlet将请求 ...
- oracle理解和导入导出
搞过sql server的程序员很难理解oracle的表空间.我在这里简单说一下吧, oracle中的表空间就相当于sql server中的实例,用户就相当于sql server中的库. 所以在ora ...
- 使用javap进行反编译Java枚举
这是一个枚举类Day.java public enum Day { MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY(" ...
- yii配置访问路由权限配置
'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'logout' => ['post', 'ge ...