求一道面试题算法

Archavon 2013-11-28 12:15:25
从一个字符串中找出重复次数最多并且是最大的子字符串!比如1231231245 应该找出12!谢谢!
...全文
305 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2013-11-29
  • 打赏
  • 举报
回复
使用后缀数组嘛。
可乐崽 2013-11-29
  • 打赏
  • 举报
回复
引用 4 楼 diamont1001 的回复:
1)先找重复次数最多的 2)找最大串
比如,例子中1231231245, 1)重复次数最多的是:1,2,都是重复了3次 2)试下1和2的组合,“12”和“21”,发现12重复最多,次数是3,得出结果
可乐崽 2013-11-29
  • 打赏
  • 举报
回复
1)先找重复次数最多的 2)找最大串
还有多远 2013-11-29
  • 打赏
  • 举报
回复
唉,上面的二重循环就要执行N*(N-1)/2次了,看来还是有问题呢,等大神的回答吧
Ericz 2013-11-29
  • 打赏
  • 举报
回复
根据字符串构建一个有向图,图的边附上权,并且记录下权最大的边,最后如果只有唯一一个边的权最大,则这个子串就是重复次数最多的最长字串,如果权有多个最大值,则检查出这几个顶点的最长路径,该路径表示的子串就是最长重复次数最多的子串。
CoolEgos 2013-11-29
  • 打赏
  • 举报
回复
先记下来,待会写写
还有多远 2013-11-28
  • 打赏
  • 举报
回复
下面提的一种方法,仅供参考:

#include <cstring>
#include <cstdio>
#include <string>
#include <map>
#include <set>
using namespace std;

struct Substring{
    const char* p;
    int len;
    //the longest and alphabetically smallest is prior
    friend bool operator < (const Substring& a, const Substring& b){
        if(a.len != b.len) return a.len < b.len;
        else return memcmp(a.p, b.p, a.len) > 0;
    }
};
struct Substring2{
    const char* p;
    int len;
    int times;
    //most frequent and longest and alphabetically smallest is prior
    friend bool operator < (const Substring2& a, const Substring2& b){
        if(a.times != b.times) return a.times > b.times;
        else if(a.len != b.len) return a.len > b.len;
        else return memcmp(a.p, b.p, a.len) < 0;
    }
};

int findRepeatMostLargestSubstr(string& dest, const string& src)
{
    int totalLen = src.size(), len;
    const char *s = src.c_str(), *e = s + totalLen, *p;
    
    map<Substring,int> substrMap;
    set<Substring2> substrSet;
    Substring tmp;
    Substring2 tmp2;
    
    for(len = 1; len <= totalLen; ++len){//count the times of every kind of Substring
        tmp2.len = tmp.len = len;
        for(p = s; p + len <= e; ++p){
            tmp2.p = tmp.p = p;
            tmp2.times = ++substrMap[tmp];
            if(tmp2.times > 1){//not the first time, so it must have been in the set
                --tmp2.times;
                //we cannot change the compare key, so we erase the item then insert a new one
                substrSet.erase(tmp2);
                ++tmp2.times;
            }
            substrSet.insert(tmp2);
        }
    }
    
    tmp2 = *substrSet.begin();
    dest = src.substr(tmp2.p-s, tmp2.len);
    return tmp2.times;
}

//测试main函数
int main()
{
    int times;
    string sub;
    times = findRepeatMostLargestSubstr(sub, "1231231245");
    
    printf("sub = %s, times = %d\n", sub.c_str(), times);
    
    getchar();
    return 0;
}
下面是复杂度分析 (1)空间复杂度: 上述算法中枚举了长度为1~N(字符串总长度)的子字符串,一共有 N*1 + (N-1)*2 + ... + (N-i)*i + ... + 1*N = sum((N+1-i)*i, i = 1~N) = sum((N+1)*i, i = 1~N) - sum(i*i, i = 1~N) = (N+1)*N(N+1)/2 - N(N+1)(2N+1)/6 = N(N+1)(N+2)/6 如果每种子字符串都不同,即无任何子字符串重复出现,则需要的空间最多,此最差空间复杂度为 N(N+1)(N+2)/6 * sizeof(Substring) * 2 = O(N^3),最后的乘2是因为同时有map和set (2)时间复杂度 观察如下代码 [code=c] friend bool operator < (const Substring& a, const Substring& b){ if(a.len != b.len) return a.len < b.len; else return memcmp(a.p, b.p, a.len) < 0; } friend bool operator < (const Substring2& a, const Substring2& b){ if(a.times != b.times) return a.times > b.times; else if(a.len != b.len) return a.len > b.len; else return memcmp(a.p, b.p, a.len) < 0; } /code] 可以看出: 长度不等时,Substring的比较的复杂度为O(1),长度相等时一次比较的最差复杂度为O(a.len); 次数不同或者长度不等时,Substring2的比较的复杂度为O(1),次数不同且长度相等时一次比较的最差复杂度为O(a.len)。 即使认为每次比较的复杂度为最差的O(N),由于一共有O( N(N+1)(N+2)/6 )次查询或插入,此时间复杂度就是 O(N)*log( O(N(N+1)(N+2)/6) ) = O(NlogN),这里取了对数是因为map和set的二分查找性质
nadleeh 2013-11-28
  • 打赏
  • 举报
回复
说个思路吧 第1,确定最大重复子串的最大长度,int max = strlen(src_str)+1/2 第2, 根据这个最大字串长度来选则字串进行比对, 第一组字串前max个,第二组从第2个字符开始,到max个,以此类推
昨日,11.19,最新整理了,第61-80题,现在公布上传。 另加上之前公布的第1-60 题,在此做一次汇总上传,以飨各位。 可以这么说,绝大部分的面试题,都是这100 道题系列的翻版, 此微软等公司数据结构+算法面试100 题系列,是极具代表性的经典面试题。 而,对你更重要的是,我自个还提供了答案下载,提供思路,呵。 所以,这份资料+答案,在网上是独一无二的。 ------------------------------------ 整理资源,下载地址: 答案系列: 1.[最新答案V0.3 版]微软等数据结构+算法面试100 题[第21-40 题答案] http://download.csdn.net/source/2832862 2.[答案V0.2 版]精选微软数据结构+算法面试100 题[前20 题]--修正 http://download.csdn.net/source/2813890 //此份答案是针对最初的V0.1 版本,进行的校正与修正。 3.[答案V0.1 版]精选微软数据结构+算法面试100 题[前25 题] http://download.csdn.net/source/2796735 题目系列: 4.[第一部分]精选微软等公司数据结构+算法经典面试100 题[1-40 题] http://download.csdn.net/source/2778852 5.[第1 题-60 题汇总]微软等数据结构+算法面试100 题 http://download.csdn.net/source/2826690 更多资源,下载地址: http://v_july_v.download.csdn.net/ 若你对以上任何题目或任何答案,有任何问题,欢迎联系我: My E-mail: zhoulei0907@yahoo.cn ------------- 作者声明: 本人July 对以上公布的所有任何题目或资源享有版权。转载以上公布的任何一题, 或上传百度文库资源,请注明出处,及作者我本人。 向你的厚道致敬。谢谢。 ---July、2010 年11 月20 日。 ------------------------------------------------------ 各位,若对以上100题任何一道,或对已上传的任何一题的答案, 有任何问题,请把你的思路、想法,回复到此帖子上, 微软等100题系列,永久维护地址(2010年11.26日): http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
此为我个人搜集整理的, 精选微软等公司,有关 数据结构和算法的面试100题[前40题], 此绝对值得你下载收藏。 网友yui评论,真是够多的了,从此,不用再看其它面试题.... 一句话,请享用。 其它资源,下载地址: 1.[最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案] http://download.csdn.net/source/2832862 2.[第1题-60题汇总]微软等数据结构+算法面试100题 http://download.csdn.net/source/2826690 3.[答案V0.2版]精选微软数据结构+算法面试100题[前20题]--修正 http://download.csdn.net/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 4.[答案V0.1版]精选微软数据结构+算法面试100题[前25题] http://download.csdn.net/source/2796735 5.[第二部分]精选微软等公司结构+算法面试100题[前41-60题]: http://download.csdn.net/source/2811703 6.[第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] http://download.csdn.net/source/2778852 更多资源,下载地址: http://v_july_v.download.csdn.net/ //请继续期待,后续内容。 ------------------------------------------------------ 各位,若对以上100题任何一道,或对已上传的任何一题的答案, 有任何问题,请把你的思路、想法,回复到此帖子上, 微软等100题系列,永久维护地址(2010年11.26日): http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html -------July、2010年12月2日。
资源说明: 此份,是为微软等公司数据结构+算法面试100 题,之前60 题的汇总。 总结整理了前第1 题-第60 题。特此并作此一份上传。以飨各位。:)。 此绝对值得你下载收藏。 ----------------------------- 网友yui评论,真是够多的了,从此,不用再看其它面试题.... 一句话,请享用。 July、2010/11.12. ------------------------------------------------ 其它资源,下载地址: [最新整理公布][汇总II]微软等数据结构+算法面试100题[第1-80题] http://download.csdn.net/source/2846055 1.[最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案] http://download.csdn.net/source/2832862 2.[第1题-60题汇总]微软等数据结构+算法面试100题 http://download.csdn.net/source/2826690 3.[答案V0.2版]精选微软数据结构+算法面试100题[前20题]--修正 http://download.csdn.net/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 4.[答案V0.1版]精选微软数据结构+算法面试100题[前25题] http://download.csdn.net/source/2796735 5.[第二部分]精选微软等公司结构+算法面试100题[前41-60题]: http://download.csdn.net/source/2811703 6.[第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] http://download.csdn.net/source/2778852 更多资源,下载地址: http://v_july_v.download.csdn.net/ ------------------------------------------------------ 各位,若对以上100题任何一道,或对已上传的任何一题的答案, 有任何问题,请把你的思路、想法,回复到此帖子上, 微软等100题系列,永久维护地址(2010年11.26日): http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
精选微软等数据结构+算法面试100题答案修正V0.2版本 -------------------- 此份答案是针对,前期已公布的最初的那份答案的,初步校正与修正。 http://download.csdn.net/source/2796735(V0.1版) 相比第一份V0.1版答案,此份答案V0.2版更加准确,亦修正了不少题目的答案。 此份20题的答案,思路更加清晰易懂,简介明了。 请享用。July、2010/11/06。 其它资源,下载地址: 1.[最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案] http://download.csdn.net/source/2832862 2.[第1题-60题汇总]微软等数据结构+算法面试100题 http://download.csdn.net/source/2826690 3.[答案V0.2版]精选微软数据结构+算法面试100题[前20题]--修正 http://download.csdn.net/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 4.[答案V0.1版]精选微软数据结构+算法面试100题[前25题] http://download.csdn.net/source/2796735 5.[第二部分]精选微软等公司结构+算法面试100题[前41-60题]: http://download.csdn.net/source/2811703 6.[第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] http://download.csdn.net/source/2778852 更多资源,下载地址: http://v_july_v.download.csdn.net/ ------------------------------------------------------ 各位,若对以上100题任何一道,或对已上传的任何一题的答案, 有任何问题,请把你的思路、想法,回复到此帖子上, 微软等100题系列,永久维护地址(2010年11.26日): http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧