新增5 最长不含重复字符的子字符串

请从字符串中找出一个最长不含重复字符的子字符串,计算该最长子字符串的长度。例如字符串“arabcacfr”中,最长不含重复字符的子字符串是“acfr”,长度为4。

思路:cur当前最长,max全局最长;hash数组记录字符对应下标;遍历字符串,如果字符对应hash值小于0,说明字符未出现,cur直接+1即可;如果大于等于0出现了说明重复字符,那就需要判断,如果两次出现长度差d大于cur说明重复字符不在当前cur长的字符串中,无需在意,cur+1即可,如果d小等于cur,说明重复字符在当前cur长的字符串汇中,需要重新计算最长长度,找规律可得cur = d。注意更新max。

int longestSubStringWithoutDuplication(const string &str)
{
    if (str.size() == 0) {
        return 0;
    }
    //历史最长,当前最长
    int max = 0, cur = 0;
    vector hash(26, -1);
    //遍历每一个字符
    for (int i = 0; i < str.size(); i++) {
        int preidx = hash[str[i] - ‘a‘];
        //之前为存储过或者重复字符距离大于当前最长未重复距离,则cur++;
        if (preidx < 0 || i - preidx > cur) {
            cur++;
        }
        //存储过,且在重复
        else {
            cur = i - preidx; //(i-1) - preidx + 1;
        }
        //存储字符对应的下标索引
        hash[str[i] - ‘a‘] = i;

        if (cur > max) {
            max = cur;
        }
    }
    return max;
}

原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8613537.html

时间: 2024-11-08 14:18:34

新增5 最长不含重复字符的子字符串的相关文章

最长不含重复字符的子字符串

输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度.例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4. 1 public static int longestSubStringWithoutDuplication(String str) { 2 int curLen = 0 ; 3 int maxLen = 0 ; 4 int[] preIndex = new int[26] ; 5 for(int i = 0 ; i < 26 ; i

剑指offer:最长不含重复字符的子字符串

题目:最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含从'a'到'z'的字符.例如,在字符串中"arabcacfr",最长非重复子字符串为"acfr",长度为4. # -*- coding: utf-8 -*- # @Time : 2019-07-11 10:57 # @Author : Jayce Wong # @ProjectName : job # @FileName : longes

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

// 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度.假设字符串中只包含从'a'到'z'的字符. #include <string> #include <iostream> // 方法一:蛮力法 bool hasDuplication(const std::string& str, int position[]); int longestSubstringWithoutDuplicat

剑指offer-最长不含重复字符的子字符串-JavaScript

题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 题目分析 留意最长子串和子序列不是一个概念.例如对"pwwkew"来说,最长子串是"wke","pwke"是其中一个子序列. 在不考虑时间的情况下,直接暴力法对所有的子串进行检查.复杂度是\(O(N^3)\),会超时错误. 解法 1: 滑动窗口 准备 2 个指针 i.j,i 指向窗口左边,j 指向右边.指针每次可以向前"滑动"一个位置,它

最长不含有重复字符的子字符串

题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含'a'~'z'的字符.例如,在字符串"arabcacfr"中,最长的不含重复字符的子字符串是"acfr",长度为 4 思路 定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最长长度,从左到右扫描,计算第i个字符串结尾的不包含重复的字符的子字符串的最长长度时f(i)时,已经知道f(i-1); 如果第i个字符之前没有出现过,那么f(i)=f(i-1)+1

leetcode:[3]最长不含重复字符子串

Input: "abcabcbb"Output: 3 Explanation: The answer is "abc", with the length of 3. Input: "bbbbb"Output: 1Explanation: The answer is "b", with the length of 1. Input: "pwwkew"Output: 3Explanation: The answ

含重复字符的字符串的全排列问题(Java)

本代码既可以输出重复和不重复字符串的全排列 /** * 含重复字符的字符串的全排列问题 * * */ public class S_28 { public static int count = 0; public static void main(String[] args){ char[] list = {'a','b','c'}; char[] list1 = {'a','b','b'}; //permutation(list); permutation(list1); System.out

找出一个字符串中最长重复次数的子字符串,并计算其重复次数

原题 找出一个字符串中最长重复次数的子字符串,并计算其重复次数.例如:字符串"abc fghi bc kl abcd lkm abcdefg",并返回"abcd"和2. 我的思路 为了方便表述,我们使用变量src作为原字符串,sub_str作为子字符串. 由于题目要求寻找至少重复2次的最长的子字符串,重点在于最长的子字符串,而不在于重复的最多次数.因此我们可以从长度最长的字符串入手,计算其重复次数.只要重复达到2次,即可返回该字符串. 显然长度最长的子字符串就是原串

java统计字符串中字符及子字符串个数

import java.util.Scanner;public class Counter { static Scanner scanner = new Scanner(System.in); public static void count(String s) { int low, upper, num, others; low = upper = num = others = 0; for (int i = 0; i < s.length(); i++) { if (Character.is