【问题标题】:Rotated strings旋转的字符串
【发布时间】:2016-05-23 06:18:32
【问题描述】:

编写代码以检查 s2 是否是 s1 的轮换,仅使用一次对 isSubString 的调用(即,waterbottleerbottlewat 的轮换)。

我为此编写程序,但无法获得所需的输出。请指导我哪里出错了。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int isRotated(char *s1, char *s2);
int isSubstring(char *s1, char *s2);

int isRotated(char *s1, char *s2)
{
        int r;
        char s[100];
        if(strlen(s1) == strlen(s2))
                strcpy(s, s1);
        r = isSubstring(s, s2);
        strcat(s, s1);
        return r;
}

int isSubstring(char *s1, char *s2){
        if(strstr(s1, s2))
                return 1;   
        else    
                return 0;
}

int main(void) {
        char s1[100], s2[100];
        printf("Enter the first String\n");
        scanf("%s", s1);
        printf("Enter the second String\n");
        scanf("%s", s2);

        if(isRotated(s1, s2)==1)
                printf("%s and %s are rotated string\n", s1, s2);
        else
                printf("%s and %s are not rotated string\n", s1, s2);

        return 0;
}

【问题讨论】:

  • 什么是STrings?????
  • “期望的输出”到底是什么意思?你得到了什么?错误信息?
  • 如果两个字符串有不同的 lengtjs,s 未初始化,这意味着isSubStringstrcat 可能对未正确终止的字符串进行操作。
  • 您显然希望通过将一个字符串连接到自身来找到旋转,然后在加倍字符串中找到另一个。现在将该策略与您编写的内容进行比较:您首先比较并连接。
  • 你还应该注意你的字符串长度。您的输入字符串最多有 99 个字符,尽管您没有强制执行该限制。 (是的,我知道,100 个字符足以解决玩具问题,但最终不检查或不知道缓冲区限制会咬你。)但这也意味着您需要最多 198 个字符的空间加上双倍字符串的终止符.

标签: c string substring


【解决方案1】:

要检查s2 是否是s1 的轮换,您可能需要集中两个s1s,并尝试在新字符串中查找s2

需要检查s1s2的长度。例如,s1 是“ABCD”,s2 是“CDA”。那么s 就是“ABCDABCD”。 strstr(s, s2) == 1,但很明显,s2 不是 s1 的轮换。

另外,我想先打电话给strcmp(),因为我认为“ABCD”是“ABCD”本身的轮换。然而,这只是一个定义问题。

int isRotated(char *s1, char *s2)
{
        char s[199];
        if(strlen(s1) != strlen(s2))
                return 0;
        else if(strcmp(s1, s2) == 0)
                return 1;
        else
                strcpy(s, s1);
        strcat(s, s1);
        return isSubString(s, s2);
}

顺便说一句:“子字符串”是一个词,因此将isSubString() 更改为isSubstring() 可能会更好

【讨论】:

  • 请注意,strstr() 不会返回 int,它会将 char * 返回到找到的子字符串,因此您的文本有点混乱。
  • 我现在已经修复了,isSubString() 将返回 1 如果strstr(s, s2) != NULL
【解决方案2】:

如果您与strstr() 进行比较,您正在搜索旋转字符串中的子字符串。因此,您要做的是在另一个字符串 s2 CDAB 中找到例如字符串 s1 ABCD。所以实际上 s2 里面没有子字符串 s1 并且你的函数 int isSubString(char *s1,char *s2) 总是会返回 false

一个简单的解决方案是不直接比较 s1 和 s2。您必须将 s2 与 s1 的双倍副本进行比较:CDABCDAC,在那里您可以看到该字符串包含一个子字符串 ABCD,并且您的函数将返回 true。

这意味着你的功能:

int isRotated(char *s1,char *s2)
{
    char s[200];
    strcpy(s,s1); // Copy content of s1 to s
    strcat(s,s1); // Append s again with the content of s1

    if(strstr(s,s2))
       return 1;
    else
       return 0;
}

【讨论】:

  • 这样更好,但对于不同长度的字符串可能会失败。另外,你实现了isRotated,而不是isSubString
【解决方案3】:

这个怎么样,使用连接并查找子字符串的方法:

int isRotated(const char *s1, const char *s2)
{
  const size_t l1 = strlen(s1);
  const size_t l2 = strlen(s2);
  if(l1 != l2)
    return 0;
  char joined[2 * l1 + 1];
  memcpy(joined, s1, l1);
  memcpy(joined + l1, s1, l1);
  joined[2 * l1] = '\0';
  return strstr(joined, s2) != NULL;
}

基本上使用更多的const,可变长度数组来处理不同的长度,当我们知道我们要复制的长度时,memcpy()

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 2011-02-06
    • 1970-01-01
    • 2010-10-21
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多