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

题目

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

思路

  定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最长长度,从左到右扫描,计算第i个字符串结尾的不包含重复的字符的子字符串的最长长度时f(i)时,已经知道f(i-1);

  1.   如果第i个字符之前没有出现过,那么f(i)=f(i-1)+1;
  2.   若果第i个字符之前出现过,那么先计算第i个字符和他上次出现在字符串中的位置距离,记为d

      1>.如果d<=f(i-1),意味着在第i个字符出现两次所夹得字符串串中间没有其他字符,第i个字符出现在f(i-1)所对应的最长字符串中。即f(i)=d;

      2>.如果d>f(i-1),此时第i个字符出现在f(i-1)对应的最长子字符串之前,所以仍然有f(i)=f(f-1)+1;

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

class Solution
{
    public:
        int max_str_duplication(const string &s);
};
int Solution::max_str_duplication(const string &s)
{
    if(s.empty()||s.length()<=0)
        return -1;

    int max_len=0;
    int curr_len=0;
    //每个字符上次出现在字符串位置中的下标,-1是没有出现过
    vector<int> position(26,-1);
    for(int i=0;i<s.length();++i)
    {
        int per_index=position[s[i]-‘a‘];
        if(per_index<0||i-per_index>curr_len)
            ++curr_len;
        else
        {
            max_len=max(max_len,curr_len);
            curr_len=i-per_index;
        }
        position[s[i]-‘a‘]=i;
    }
    return max(max_len,curr_len);
}
int main()
{
    string str;
    cin>>str;
    Solution s;
    cout<<s.max_str_duplication(str)<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/tianzeng/p/10258973.html

时间: 2024-10-07 15:12:50

最长不含有重复字符的子字符串的相关文章

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

请从字符串中找出一个最长不含重复字符的子字符串,计算该最长子字符串的长度.例如字符串"arabcacfr"中,最长不含重复字符的子字符串是"acfr",长度为4. 思路:cur当前最长,max全局最长:hash数组记录字符对应下标:遍历字符串,如果字符对应hash值小于0,说明字符未出现,cur直接+1即可:如果大于等于0出现了说明重复字符,那就需要判断,如果两次出现长度差d大于cur说明重复字符不在当前cur长的字符串中,无需在意,cur+1即可,如果d小等于cu

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

输入一个字符串(只包含 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 指向右边.指针每次可以向前"滑动"一个位置,它

【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出

leecode-找出其中不含有重复字符的 最长子串 的长度

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.这道题主要用到思路是:滑动窗口 class Solution { /** * @param String $s * @return Integer */ function lengthOfLongestSubstring($s) { $len = strlen($s); $sarr = str_split($s,1); $varr = array_flip($sarr); $arr = []; $left =0; $mmmm = 0

每天一道算法题(39)——含有重复字符的全排列

思路 (1)对于含有重复字符的全排列必须使用isSwap函数 (2)整体思路 a,交换当前子字符串(i----n-1)字符与子字符串后面的每一个位置的字符(满足交换条件下) b,子字符串位置后移(i+1-----n).递归处理子字符串 c,将a中的交换复原. 代码 #include <iostream> #include"string" using namespace std; void swap(char& a,char& b){//交换 char tem

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

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