| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1601 人关注过本帖, 1 人收藏
标题:OJ 题目:字符串匹配 求指点
只看楼主 加入收藏
shell羊
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2014-10-31
结帖率:66.67%
收藏(1)
已结贴  问题点数:20 回复次数:11 
OJ 题目:字符串匹配 求指点
题目描述

给你一个字符串,请你判断将此字符串转化成a^n形式的最大的n是多少。
例如:abcd=(abcd)^1,则n=1;
         aaaa=a^4,则n=4;
         ababab=(ab)^3,则n=3。
输入格式

输入包含多组测试数据。每组输入为一个字符串,长度不超过100,其中不包含空格等空白符。当输入为一个“.”时,输入结束。
输出

对于每组输入,输出将此字符串转化成a^n形式的最大的n。
样例输入

abcd
aaaa
ababab
.
样例输出

1
4
3
原文链接:http://zju.

想了好久,初步的思路是将前面一小段的字符串(从第一个字符开始的字符串)不断的循环变量 i 与后面第二个开始的字符串进行比较。但是问题是前面一个字符串不知道从哪里开始结束。而后面的也不知道从哪里开始结束。可能我的思路错了??还是一些具体的细节没想到??所以还是来请大侠指点一下核心的思路。最好能附上简单的代码说明。
搜索更多相关主题的帖子: 字符串 最大的 
2014-11-01 22:44
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
没太看懂题目,统计每行里字符a的数目?

梦想拥有一台龙芯3A-4000
2014-11-02 01:19
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


读行并统计a的数目 -> 链表

梦想拥有一台龙芯3A-4000
2014-11-02 01:28
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
试试这段代码
程序代码:
#include <stdio.h>
#include <string.h>

int cal(char * s)
{
    int n, i, j, k;

    n = strlen(s);
    for(j = 0, i = 1; i <= n / 2 && j < i; i += j < i)
    if(n % i == 0)
    for(k = n, j = 0; j < i && k >= n; j += k >= n)
    for(k = j + i; k < n && s[k] == s[j]; k += i);

    return n / i;
}

int main()
{
    char s[128];
    for(; gets(s)[0] != '.'; printf("%d\n", cal(s)));
    return 0;
}

重剑无锋,大巧不工
2014-11-02 17:53
shell羊
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2014-10-31
收藏
得分:0 
回复 4 楼 beyondyf
测试了一下,OJ上说有一个小bug,能不能讲解一下思路。。代码看了一会貌似好难看懂= =
2014-11-02 23:46
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
同楼上问,b版的代码太精简了额
2014-11-03 10:43
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵说的这么客气。亲自去试了一下结果是某个数据参考输出为5时我的代码居然没有输出。

没有输出那就是说我的程序终止了,意味着这个数据的第一个字符是"."。(我的程序结束条件即是如此)

于是又重新阅读了一遍题目,重点落在了最后一句话——当输入为一个“.”时,输入结束。

呵呵,差一点都不行。这意味着"."是可以出现在数据字符串中的,当且仅当该串只包含一个"."时才作为结束标志。

于是修改了代码重新提交。AC。
程序代码:
#include <stdio.h>
#include <string.h>

int cal(char * s)
{
    int n, i, j, k;

    n = strlen(s);
    for(j = 0, i = 1; i <= n / 2 && j < i; i += j < i)
    if(n % i == 0)
    for(k = n, j = 0; j < i && k >= n; j += k >= n)
    for(k = j + i; k < n && s[k] == s[j]; k += i);

    return n / i;
}

int main()
{
    char s[128];
    for(; strcmp(gets(s), "."); printf("%d\n", cal(s)));
    return 0;
}

重剑无锋,大巧不工
2014-11-03 21:59
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
写成这样是不是好理解一些?

简单解释一下cal中各变量的意义:

n:字符串的长度

i:测试子串的长度,它应该能整除n

j:子串内的偏移量

k:以j为基点,i为步长的偏移量,用于指向各个子串的相同偏移位置。以测试各子串相同位置的字符是否相等。
程序代码:
#include <stdio.h>
#include <string.h>

int cal(char * s)
{
    int n, i, j, k;

    n = strlen(s);
    for(i = 1; i <= n / 2; i++)
    {
        if(n % i) continue;
        for(j = 0; j < i; j++)
        {
            for(k = j + i; k < n && s[k] == s[j]; k += i);
            if(k < n) break;
        }
        if(j == i) break;
    }

    return n / i;
}

int main()
{
    char s[128];
    for(; strcmp(gets(s), "."); printf("%d\n", cal(s)));
    return 0;
}

有兴趣可以对比一下两段代码。算法完全相同,第一段只是用逻辑表达式代替了第二段中的判断跳转语句。

这也用一个实例验证了break、continue这两种跳转方式也不是必须的。更何况goto

[ 本帖最后由 beyondyf 于 2014-11-3 22:19 编辑 ]

重剑无锋,大巧不工
2014-11-03 22:15
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 8 楼 beyondyf
真的很赞!学习啦
2014-11-03 23:16
shell羊
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2014-10-31
收藏
得分:0 
回复 8 楼 beyondyf
恩。。清晰了很多。。谢谢斑竹大大。么么哒。。最后贴上自己刚AC的代码。。算法上
跟斑竹大大的代码是一样的算是给这个帖子这道题目一个结束吧。= =话说斑竹大大你的等级好高啊o_o
程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
    char s[110];
    int l,i,j,flag;

    while(strcmp(gets(s),".") != 0)
    {

        l = strlen(s);
        for(i = 1; i <= l / 2; i++)
        {
            flag = 0;
            if(l % i != 0)
            {
                continue;
            }
            for(j = i; j < l; j += i)
            {
                if(strncmp(&s[j],s,i) != 0)
                {
                    flag = 1; //flag = 1 表示不相等
                    break;
                }
            }
            if(flag == 1)
            {
                continue;
            }
            else
            {
                printf("%d\n",l / i);
                break;
            }

        }
        if(i == l)
        {
            printf("%d\n",l / i);
        }

    }
    return 0;
}

2014-11-03 23:49
快速回复:OJ 题目:字符串匹配 求指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041099 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved