标题:字符串旋转和追加
只看楼主
小cai鸟
Rank: 2
等 级:论坛游民
帖 子:53
专家分:25
注 册:2018-7-13
结帖率:60%
已结贴  问题点数:20 回复次数:6 
字符串旋转和追加

有人看懂了这一道题吗?
能稍微讲解下解题思路吗?
我不知道两种步骤怎么随意走 而且如果是不可能  那么什么时候算停止呢?
搜索更多相关主题的帖子: 字符串 旋转 追加 而且 停止 
2019-01-21 17:34
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:7 
S或者将S翻转,一定是T的一部分,因为S的操作只能在两端,当S不同于T且进行两种操作后,都不能变成T或者成为T的一部分,那么就可以停止了。
2019-01-23 09:38
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
貌似不需要模拟操作,可以试着找规律
2019-01-23 09:51
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
得分:7 
1、判断字符串S和字符串T是否长度相同,如果字符串S长度大于字符串T,直接输出impossible
2、长度相同再判断字符串是否相等,不相等输出impossible
3、长度不同,且字符串S的长度小于字符串T的长度
4、判断字符串S的正序或者反序是否属于字符串T的一部分,如果不属于,直接输出impossible
5、如果字符串S正序属于字符串T的一部分,计算字符串T中不属于字符串S左右两端的'B'的个数是否相同,相同输出possible,不同输出impossible
6、如果字符串S反序属于字符串T的一部分,计算字符串T中不属于字符串S左右两端的'B'的个数是否右边的字符'B'比左边的多一个,是的输出possible,不是输出impossible
2019-01-23 10:45
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:7 
在possible后拼接一个字符串im,分别翻转possible和im,然后再反转整个字符串
2019-01-23 11:30
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
回复 4楼 kfyniriu
少了一点,字符串反转只能加'B',所以字符串s左端对应的必须是B(不是s[0]),比如S:BAABB, T:BAA BAABB BAA;这个例子就行不通


[此贴子已经被作者于2019-1-23 17:30编辑过]

2019-01-23 13:41
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
你试一下这个程序能不能行
程序代码:
#include <stdio.h>
#include <string.h>

#define LENTH 1000

int main(void)
{
    int judge(char *, char *);

    char s[LENTH], t[LENTH];

    printf("输入字符串s、t:\n");
    scanf("%s%s", s, t);

    if (judge(s, t))
        printf("Possible\n");
    else
        printf("Impossible\n");

    return 0;
}

int judge(char *s, char *t)
{
    unsigned num_B_s, num_B_t;
    unsigned  D_value_B, front_B_should, front_B;
    size_t len_s, len_t;
    size_t i, j;

    len_s = strlen(s);
    len_t = strlen(t);

    for (i = 0, num_B_s = 0; i < len_s; i++)
        if (s[i] == 'B')
            ++num_B_s;
    for (i = 0, num_B_t = 0; i < len_t; i++)
        if (t[i] == 'B')
            ++num_B_t;

    if (num_B_s > num_B_t)
        return 0;
    else if (num_B_s == num_B_t)
    {
        for (i = 0; i < len_s; i++)
            if (s[i] != t[i])
                break;
        if (i == len_s)
            return 1;
        else
            return 0;
    }
    else
    {
        D_value_B = num_B_t - num_B_s;
        front_B_should = D_value_B / 2 + D_value_B % 2;

        for (i = 0, front_B = 0; ; i++)
        {
            if (t[i] != 'B')
                continue;
            if (++front_B == front_B_should)
                break;
        }

        if (D_value_B % 2)
        {
            for (j = 0; j < len_s; j++)
                if (s[j] != t[i + len_s - j])
                    break;
            if (j == len_s)
                return 1;
            else
                return 0;
        }
        else
        {
            for (++i, j = 0; j < len_s; j++)
                if (s[j] != t[i + j])
                    break;
            if (j == len_s)
                return 1;
            else
                return 0;
        }
    }
}

这个程序经过多次修改,最终还是换成最初的那个(一开始没有考虑太多,反倒没问题...(我认为))

[此贴子已经被作者于2019-1-24 17:14编辑过]

2019-01-24 15:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-492784-1-1.html




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

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