题目描述

  请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含'a'~'z'的字符。例如,在字符串"arabcacfr"中,最长的不含重复字符的子字符串是"acfr",长度为4。

牛客网刷题地址

思路分析

  动态规划算法。首先定义函数f(i)表示以第i个字符为结尾的不包含重复字符的子字符串的最长长度。我们从左到右逐扫描字符串中的每个字符。当我们计算以第i个字符为结尾的不包含重复字符的子字符串的最长长度f(i)时, 我们已经知道f(i-1)了,分为下面的几种情况:

  1. 如果第i个字符之前没有出现过,那么 f(i) = f(i-1)+1;
  2. 如果出现过,计算第i个字符与它上次出现的位置之间的距离d,这个可以利用一个数组缓存起来,之后分为两种情况:
    1. 如果d小于或者等于f(i-1),f(i)=d;
    2. 如果d大于f(i-1),f(i) = f(i-1)+1;

测试用例

  1. 功能测试:包含多个字符的字符串;只有一个字符的字符串;所有字符都唯一的字符串; 所有字符都相同的字符串。
  2. 特殊输入测试:空字符串。

Java代码

public class Offer048 {
public static void main(String[] args) {
test1();
test2();
test3(); } public static int LongSubStringWithOutDup(String str) {
return Solution1(str);
}
private static int Solution1(String str) {
if(str==null || str.length()<=0) {
return 0;
}
int preLength = 0;
int curLength = 0;
int maxLength = 0;
int[] position = new int[26];
for(int i=0;i<position.length;i++) {
position[i]=-1;
}
for(int i=0;i<str.length();i++) {
int prevIndex = position[str.charAt(i)-'a'];
if( prevIndex <0 || i-prevIndex > preLength) {
// 第i个字符之前没有出现过或者出现过但是距离大于f(i-1)
curLength = preLength+1;
}else {
curLength = i-prevIndex;
}
position[str.charAt(i)-'a'] = i;
if(curLength>maxLength) {
maxLength=curLength;
}
preLength = curLength;
} return maxLength;
} private static void test1() {
int result = LongSubStringWithOutDup("arabcacfr");
System.out.println(result);
} private static void test2() { }
private static void test3() { } }

代码链接

剑指Offer代码-Java

【Offer】[48] 【最长不含重复字符的子字符串】的更多相关文章

  1. 剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口

    剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Aut ...

  2. 【Java】 剑指offer(48) 最长不含重复字符的子字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字 ...

  3. 每日一题 - 剑指 Offer 48. 最长不含重复字符的子字符串

    题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 哈希表 难易程度:中等 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度 ...

  4. 剑指 Offer 48. 最长不含重复字符的子字符串

    题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...

  5. 剑指offer——50最长不含重复字符和子字符串

    题目: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含’a~z”的字符.例如,在字符串“arabcacfr"中,最长的不含重复字符的子字符串 ...

  6. 剑指offer面试题48: 最长不含重复字符的子字符串

    Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...

  7. 《剑指offer》面试题48. 最长不含重复字符的子字符串

    问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.   示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  8. 《剑指offer》第四十八题(最长不含重复字符的子字符串)

    // 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度.假设字符串中只包含从'a'到'z'的字符. #inclu ...

  9. 剑指offer-面试题48-最长不含重复字符的子字符串-动态规划

    /* 题目: 最长不含重复字符的子字符串. */ /* 思路: f(i) = f(i-1) + 1,(未出现过当前字符,distance > f(i-1) distance,当前字符和上一次出现 ...

随机推荐

  1. Wpf窗口设置可拖动

    在窗口界面的一个控件(TopGrid)设置如下MouseLeftButtonDown事件即可 private void TopGrid_MouseLeftButtonDown(object sende ...

  2. Wpf窗口设置屏幕居中最前显示

    public Window()         {             InitializeComponent();             WindowStartupLocation = Win ...

  3. 10分钟了解一致性hash算法

    应用场景 当我们的数据表超过500万条或更多时,我们就会考虑到采用分库分表:当我们的系统使用了一台缓存服务器还是不能满足的时候,我们会使用多台缓存服务器,那我们如何去访问背后的库表或缓存服务器呢,我们 ...

  4. Xamarin 基础知识

    Xamarin 跨平台处理: C#: if (Device.OS == TargetPlatform.Android) { Code…… } else if (Device.OS == TargetP ...

  5. 解决 Android 中出现依赖多个版本支持库的问题

    在 app 的 build.gradle 中引入依赖时发现如下错误: All com.android.support libraries must use the exact same version ...

  6. 使用CXF实现WebService

    一.首先创建一个maven项目,引入相应的jar包 <?xml version="1.0" encoding="UTF-8"?> <proje ...

  7. Window.open使用总结

    前言 今天在项目中,突然看到window.open的使用,感觉还是很神奇,突然心血来潮查看了window.open的用法. 用途 主要用于在打开网站时弹出的其他窗口.用于通知广告一类的. 用法 win ...

  8. windows server2012 nVME和网卡等驱动和不识别RAID10问题

    安装2012---不识别M.2 nVME,下官方驱动,注入到系统里 缺多驱动---用ITSK万能驱动添加:|Win8012R2.x64(可解决不支持操作系统,win10与server2012R2通用) ...

  9. 云片RocketMQ实战:Stargate的前世今生

    RocketMQ消息队列,专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积.高吞吐.可靠重试等特性,是应对企业业务峰值时刻必备的技术. 云片由于 ...

  10. 构建docker虚拟化平台

    安装epel-release扩展包 yum install epel-release -y 安装docker yum install docker-ce 启动docker systemctl star ...