CTCI 系列 --1.3 判断两个字符串是否互为变换(C 语言)

本贴最后更新于 2889 天前,其中的信息可能已经水流花落

题目:Given two strings,write a method to decide if one is a permutation of the other.

对于给定的两个字符串,写一个方法判断其中一个是否是另一个的变换。

解题思路

分析题目,要判断一个字符串是否是另一个字符串变换得来。那么首先,这两个字符串必须==长度相等==;其次两个字符串中的每个字符必须相一致。

那么,我们代码可以这样实现:

  • 先判断两个字符串的长度,若不相等则返回 false;若相等进入下一步
  • 对两个字符串分别进行排序
  • 排序完,使用 memcpy() 函数进行内存对比,如相等则返回 true,不相等则返回 false

代码如下:

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

void swap(char *a, char*b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

void sort_string(char *str,int len)
{
    int i, j;
    char flag = 0;
    for (i = 0; i < len; i++)
    {
        flag = 0;
        for (j = 1; j < len - i - 1; j++)
        {
            if (str[j] > str[j + 1])
            {
                swap(&str[j], &str[j + 1]);
                flag = 1;
            }
        }

        if (0 == flag)
            break;
    }
}

//返回1 ---- 字符串互为变换 0 ---- 字符串不是
int campara_str(char *str1, char *str2)
{
    int len1=0, len2 = 0;

    len1 = strlen(str1);
    len2 = strlen(str2);

    sort_string(str1, len1);
    sort_string(str2, len2);

    if (memcmp(str1, str2, len1) == 0)
        return 1;
    else
        return 0;
}

int main(void)
{
    char buf1[6];
    char buf2[6];

    memset(buf1, 0, sizeof(buf1));
    memset(buf2, 0, sizeof(buf2));
    strcpy(buf1, "hello");
    strcpy(buf2, "helol");

    if (campara_str(buf1, buf2))
    {
        printf("The two strings is anagram!\n");
    }
    else
    {
        printf("The two strings is not anagram!\n");
    }

    memset(buf2, 0, sizeof(buf2));
    strcpy(buf2, "helio");

    if (campara_str(buf1, buf2))
    {
        printf("The two strings is anagram!\n");
    }
    else
    {
        printf("The two strings is not anagram!\n");
    }

    getchar();

    return 0;
}

PS: 不要直接比较两个静态字符串 campara_str("hello", "helol") ,const 数据是无法修改的,排序时会出错。

运行结果

运行结果

另一种方法

还有一种方法,就是统计两个字符串中每个字符的出现次数,然后做比较。若出现次数一致则返回 true;否则返回 flase.
算法如下:

int campara_str2(char *str1, char *str2)
{
    int letter1[256],letter2[256];

    memset(letter1, 0, sizeof(letter1));
    memset(letter2, 0, sizeof(letter2));

    while (*str1 != '\0')
    {
        letter1[*str1++]++;
    }

    while (*str2 != '\0')
    {
        letter2[*str2++]++;
    }

    if (memcmp((void *)&letter1, (void *)&letter2, sizeof(letter1)) == 0)
        return 1;
    else
        return 0;
}

  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖
  • 算法
    428 引用 • 254 回帖 • 24 关注
  • CTCI
    5 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...