zoukankan      html  css  js  c++  java
  • 【字符串】若干编程

    1.求一个字符串中连续出现次数最多的子串。

    我自己的思路:

    遍历所有可能的子串的长度,遍历所有可能的起始位置,后面遍历查找有多少连续相同的子串,更新最大次数。

    我是用C实现的。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    char * maxTimeSubStr(const char * str_in)
    {
        int n = strlen(str_in);
        char * word = (char *)malloc((n + 1) * sizeof(char));
        char * tmp = (char *)malloc((n + 1) * sizeof(char));
        char * max_times_word = (char *)malloc((n + 1) * sizeof(char));
        int max_times = 0;
        for(int i = 1; i <= n; i++) //长度
        {
            for(int j = 0; j + i < n; j++) //起始位置
            {
                int times = 1;
                int k;
                for(k = 0; k < i; k++)//获取当前的字符串
                {
                    word[k] = str_in[j + k];
                }
                word[k] = '';
    
                for(int k = j + i; k + i - 1 < n; k += i) //查找后面有几个连续相同的字符串 这是每个字符串的起始位置
                {
                    bool bsame = true;
                    for(int l = 0; l < i; l++) //新字符串逐位比较
                    {
                        if(str_in[k + l] != word[l])
                        {
                            bsame = false;
                            break;
                        }
                    }
                    if(bsame)
                        times++;
                    else
                        break;
                }
                if(times > max_times)
                {
                    max_times = times;
                    strcpy(max_times_word, word);
                }
            }
        }
    
        free(word);
        free(tmp);
        return max_times_word;
    }
    
    int main()
    {
        char * c = maxTimeSubStr("abcabjalsfjalg ajaslcabcabcccas");
        return 0;
    }

    书上答案的思路:用C++实现的

    思路是遍历所有的子串起始位置,遍历所有的子串结束位置,判断后面连续子串个数。

    关键不同点:

    ①我遍历的是所有的长度和所有起始点,而答案遍历的是所有起始点和终点。用答案的方法会写代码的时候思路更清楚。

    //14.5 例1 答案
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    pair<int, string> fun(const string & str)
    {
        vector<string> substrs;
        int maxcount = 0, count = 1;
        string substr;
        int i, len = str.length();
        for(i = 0; i < len; ++i) //遍历所有子串起始位置
        {
            for(int j = i + 1; j < len; ++j) //遍历所有子串终点位置
            {
                count = 1;
                for(int k = j; k < len; k += j - i) //判断后面有多少个连续的 以 str[i] 到 str[j]组成的子串 k是下一个子串的开始位置
                {
                    if(str.substr(i, j - i) == str.substr(k, j - i))
                        ++count;
                    else
                        break;
                }
                if(count > maxcount)
                {
                    maxcount = count;
                    substr = str.substr(i, j - i);
                }
            }
        }
        return make_pair(maxcount, substr);
    }
    
    int main()
    {
        string str;
        pair<int, string> rs;
        while(cin >> str)
        {
            rs = fun(str);
            cout << rs.second << ':' << rs.first << '
    ';
        }
        return 0;
    }
  • 相关阅读:
    js/Jquery table 内部控件计算和tr的生成
    反射 实体类的赋值/取值问题
    C#读取Excel 几种方法的体会
    水晶报表升级遇到的问题
    使用异或位运算符实现交换两个整数详解
    美国宇航局两万兆数据存储方案下载
    Flash全屏(转载)
    Unity3D实现动态加载游戏资源
    C#,ASP.NET jquery uploadify上传控件中文乱码解决办法
    HTML通过button触发inputfile控件上传文件的问题
  • 原文地址:https://www.cnblogs.com/dplearning/p/4618647.html
Copyright © 2011-2022 走看看