例子

"abmadsefadd"  最长长度为7

"avoaid"           最长长度为3

思路

空间换时间hashTable,起始位置设为beg。初始化全局最大值0。开辟字符数组,起初标为0。

访问数组时

  • 如果该字符在hashTable对应的哈希值为1,则计算当前位置到beg的距离,并且把beg赋值为beg+1。如果大于全局最大值,则替换全局最大值
  • 如果该字符在hashTable对应的哈希值为0,则置1

参考代码

#include <iostream>
#include <cstring>
using namespace std;

int getMaxLen2(string str)
{    
    int len = str.length();
    int appear[256]={0};
    memset(appear,-1,sizeof(appear));
    int preCnt=1;
    appear[str[0]]=0;
    int ret = 1;    
    for(int i=1;i<len;++i)
    {
        int dif = i-appear[str[i]];
        if(dif>preCnt)
        {
            ++preCnt;
            if(preCnt>ret)
            {
                ret = preCnt;
            }
        }
        else
        {
            preCnt = dif;
        }
        appear[str[i]] = i;
    }
    return ret;
}
int getMaxLen(const string &s) //有问题,如果输入为abcbgef
{
int beg = ;
int span = ;
int maxspan = ;
int hashTable[];
for (int i = ; i < ; ++i)
hashTable[i] = ;
int lens = s.size();
for(int i = ; i < lens; ++i)
{
int index = s[i];
if (hashTable[index] == )
{
span = i - beg;
if (span > maxspan)
maxspan = span;
beg++;
}
else
{
hashTable[s[i]] = ;
}
}
return maxspan;
} int main()
{
const string a = "abmadsefadd";
const string a1 = "abcbge";
cout << getMaxLen(a) << endl;
cout << getMaxLen(a1) << endl; //错:输出为3
  cout << getMaxLen2(a1) << endl;   //正确:输出为4
}

结果


Algorithm --> 字符串中最长不重合子串长度的更多相关文章

  1. 字符串中连续出现最多的子串 &amp; 字符串中最长反复子串

    字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀 ...

  2. 【Java例题】5.5 两个字符串中最长公共子串

    5. 查找两个字符串中含有的最长字符数的公共子串. package chapter5; import java.util.Scanner; public class demo5 { public st ...

  3. 【poj3294-不小于k个字符串中最长公共子串】后缀数组

    1.注意每两个串之间的连接符要不一样. 2.分组的时候要注意最后一组啊!又漏了! 3.开数组要考虑连接符的数量.100010是不够的至少要101000. #include<cstdio> ...

  4. 基于python 3.5 所做的找出来一个字符串中最长不重复子串算法

    功能:找出来一个字符串中最长不重复子串 def find_longest_no_repeat_substr(one_str): #定义一个列表用于存储非重复字符子串 res_list=[] #获得字符 ...

  5. python经典算法题:求字符串中最长的回文子串

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...

  6. 7-19 计算有n个字符串中最长的字符串长度 (40 分)

    编写程序,用于计算有n(1<n<10)个字符串中最长的字符串的长度.前导空格不要计算在内! 输入格式: 在第一行中输入n,接下的每行输入一个字符串 输出格式: 在一行中输出最长的字符串的长 ...

  7. java基础知识回顾之---java String final类普通方法的应用之“两个字符串中最大相同的子串”

    /* * 3,两个字符串中最大相同的子串. * "qwerabcdtyuiop" * "xcabcdvbn" *  * 思路: * 1,既然取得是最大子串,先看 ...

  8. 算法练习:求字符串的最长重复子串(Java实现)

    1. 求字符串的最长重复子串 例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa 算法思路:算法时间复杂度(O(n)) 1. 将这一个字符串先转成cha ...

  9. POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串

    题目链接:https://vjudge.net/problem/POJ-2774 Long Long Message Time Limit: 4000MS   Memory Limit: 131072 ...

随机推荐

  1. DSP_TMS32F2812的串口操作

    void scia_fifo_init(int ibaud) { SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parit ...

  2. Android学习基础之onSaveInstanceState和onRestoreInstanceState触发的时机

    先看Application Fundamentals上的一段话:    Android calls onSaveInstanceState() before the activity becomes ...

  3. R学习笔记(4): 使用外部数据

    来源于:R学习笔记(4): 使用外部数据 博客:心内求法 鉴于内存的非持久性和容量限制,一个有效的数据处理工具必须能够使用外部数据:能够从外部获取大量的数据,也能够将处理结果保存.R中提供了一系列的函 ...

  4. weblogic部署web项目出现错误

    1.错误描述 <2015-3-15 下午02时13分01秒 CST> <Info> <Security> <BEA-090905> <Disabl ...

  5. 芝麻HTTP:爬虫的基本原理

    我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛.把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息.可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛 ...

  6. 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。

    用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...

  7. JavaScript设计模式(3)-工厂模式

    工厂模式 1. 简单工厂 简单工厂:使用一个类或对象封装实例化操作 假如我们有个自行车商店类 BicycleShop,它提供了销售自行车的方法可以选择销售两类自行车 Speedster,Comfort ...

  8. sass语法练习解析--实例练习

    暂时使用的是:Koala,监测转义 $fff: #ffffff; $red:red;   h1{   color: $fff; } 简单调用     #content{     color: $fff ...

  9. 戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法

    CyclicBarrier是JDK 1.5 concurrent包出现的一个用于解决多条线程阻塞,当达到一定条件时一起放行的一个类.我们先来看这样一个简单的需求. 现在我有一个写入数据的类,继承Run ...

  10. 【BZOJ3506】排序机械臂(Splay)

    [BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...