【华为练习题 】 字符串的最小周期(中级)

【华为练习题 】 字符串的最小周期(中级)

题目

如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3)。字符串的长度小于等于100,由调用者保证。

原型:
int GetMinPeriod(char *inputstring);
输入参数:
char * inputstring:字符串
返回值:
int 字符串最小周期

分析

用指针向后寻找与第一个字符相同的字符,找到之后,验证两字符之间的子串是否可以重复得到字符串,如果是,则返回两字符的距离,如果不是,则继续寻找下一个与第一个字符相同的字符。

解答

int GetMinPeriod(char *inputstring){
    char *ahead = inputstring + 1;
    // 如果存在不为1的周期,子串长度必然小于等于总长度的一半
    while (ahead - inputstring <= (int)strlen(inputstring)/2)
    {
        // 周期子串长度必然能被总长度整除
        if (*ahead != *inputstring || strlen(inputstring) % (ahead - inputstring))
        {
            ahead++;
            continue;
        }
        char *b = inputstring, *e = ahead;
        while (*e != ‘\0‘)
        {
            if (*b != *e)
            {
                ahead++;
                break;
            }
            b++;
            e++;
        }
        return ahead - inputstring;
    }
    return 1;
}

int main()
{
    char input[100];
    cin.getline(input,100);
    cout << GetMinPeriod(input) << endl;
    return 0;
}
时间: 2024-10-10 04:58:52

【华为练习题 】 字符串的最小周期(中级)的相关文章

POJ--2406Power Strings+KMP求字符串最小周期

题目链接:点击进入 事实上就是KMP算法next数组的简单应用.假设我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x.这就是这个题目的关键点. 代码例如以下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=1000000+100; char str[maxn]; in

[华为机试练习题]1.周期串问题

题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期.例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3).字符串的长度小于等于100,由调用者保证. 接口说明 原型: int GetMinPeriod(char *inputstring); 输入参数: char * inputstring:字符串 返回值: int 字符串最小周期 代码一 /*-----------------------------------

E - Power Strings,求最小周期串

E - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2406 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = &

迭代加深搜索求字符串最小周期

1 //==================================================== 2 //迭代加深搜索求字符串最小周期: 3 //==================================================== 4 5 #include <stdio.h> 6 #include <Windows.h> 7 #include <stdlib.h> 8 9 int main() 10 { 11 char *str; 1

【华为练习题】用两个栈来模拟队列(中级)

[华为练习题]用两个栈来模拟队列(中级) 题目 栈的特点是后进先出,队列的特点是先进先出.所以,用两个栈S1和S2模拟一个队列时, 要求两个栈S1和S2的长度都是5. 要求实现以下函数: enQueue 将元素value插入队列,若入队列成功返回true,否则返回false deQueue 从队列中取出一个元素放入value,若出队列成功返回true,否则返回false. isEmptyQueue 判用队列是否为空,如果是空则返回true,如果不是空则返回false. 分析 S1作输入栈,逐个元

【华为练习题】十六进制字符串形式转为内存值形式

[华为练习题]十六进制字符串形式转为内存值形式 题目 功能:将十六进制字符串形式内容转为内存值形式(注:pBuffer的内存申请由调用者保证) 输入:szHexText:十六进制字符串形式,如: "6566" 输出:dataOutput,其中:内存值形式Buffer,即内存的{0x65, 0x66} 返回:返回转换成功的buffer的有效字节数 解答 #include <iostream> #include <string> using namespace st

【华为练习题】 最后一个单词的长度(初级)

[华为练习题] 最后一个单词的长度(初级) 题目 描述: 计算字符串最后一个单词的长度,单词以空格隔开. 题目类别: 字符串 输入: 一行字符串,长度小于128. 输出: 整数N,最后一个单词的长度. 样例输入: hello world 样例输出: 5 解答 #include <iostream> #include <string> using namespace std; int last_word_length(const string &s){ auto begin

【华为练习题】字符出现频率

[华为练习题]字符出现频率 题目 描述:写出一个程序,输出基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 举例: 输入:wo shi, yi zhi.xiao xiao niao ' '(空格) 输出:0.17 接口说明: /* 功能: 输入的基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 输入: String pString 输入的基准字符串

【华为练习题】乒乓球赛制

[华为练习题]乒乓球赛制 题目 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响.在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙. 华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录