【问题标题】:anagram detecting using linked lists in c在c中使用链表检测字谜
【发布时间】:2014-01-15 08:28:43
【问题描述】:

我正在尝试编写一个代码来检查 2 个单词是否是字谜,使用链表。为此,我想它应该从用户那里接收 2 个单词并将它们包含的每个字母传递给链表的节点,并比较节点是否具有相同的字母,如果是,则从第二个单词中删除相同的字母。当该过程完成时,如果第二个列表为空,则它们是字谜。即使1个字母不匹配,它应该返回0,但我不知道如何确定这些单词的长度,这是我到目前为止写的内容

#include <stdio.h>
#include <stdlib.h>
struct node                 
{
    struct node *prev;
    struct node *next;
    char data;          
};

typedef struct node *NODE,NOD;

NODE last(NODE list)        
{                           
    if(list!=NULL)
    while(list->next!=NULL)
        list=list->next;
    NODE lst;
    lst=list;
    return lst;
}



void insert( char letter, NODE list)         
{
    NODE nod;
    nod=(NODE)malloc(sizeof(NOD));
    nod->next=NULL;
    nod->prev=NULL;
    nod->data=letter;
    if(list==NULL)
    {
        list=nod;
    }
    else
    {
        nod->prev=last(list);
        last(list)->next=nod;
    }
}

【问题讨论】:

  • 伪代码:bool isAnagram(word1, word2){return sort(word1) == sort(word2);}

标签: c linked-list anagram


【解决方案1】:

只需检查每个单词中每个字母的数量是否相同。

int anagrams(const char *a, const char *b) {
    int counts[256] = {0};
    while (*a) counts[*a++]++;
    while (*b) counts[*b++]--;
    for (int i = 0; i < 256; i++) {
        if (counts[i]) return 0;
    }
    return 1;
}

【讨论】:

    【解决方案2】:

    为什么要使用链表来解决这么简单的问题?

    O(N) 解:

    计算每个单词的每个字母的频率,然后比较这两个直方图。如果它们相等,则可以从另一个词中获得一个词。

    如果你想使用基于链表的解决方案,那么单词的长度确实是:

    • 每个输入单词的长度(它们必须具有相同的长度) - 可以通过从链表头到尾的单次遍历来计算。
    • 移除符号的数量

    【讨论】:

    • @Morbidity 使用链表有什么好处?
    【解决方案3】:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    typedef struct node {
        char data;
        struct node *prev;
        struct node *next;
    } NODE;
    
    NODE *newNode(char ch){
        NODE *p = malloc(sizeof(NODE));
        if(p){
            p->data = ch;
            p->prev = p->next = NULL;
        }
        return p;
    }
    
    void insert(NODE **list, NODE *node){
        if(*list == NULL){
            *list = node;
            return ;
        }
        NODE *curr = *list;
        while(curr){
            if(curr->data >= node->data){//insert sort
                if(curr->prev == NULL)
                    *list = node;
                else
                    curr->prev->next = node;
                node->prev = curr->prev;
                curr->prev = node;
                node->next = curr;
                break;
            }
            if(curr->next == NULL){
                curr->next = node;
                node->prev = curr;
                break;
            } else
                curr = curr->next;
        }
    }
    
    NODE *input_word(){
        NODE *word=NULL;
        int ch;
        while(EOF!=(ch=getchar()) && ch != '\n'){
            insert(&word, newNode(ch));
        }
        return word;
    }
    
    bool isAnagram(NODE *word1, NODE *word2){
        while(word1 && word2){
            if(word1->data != word2-> data)
                return false;
            word1 = word1->next;
            word2 = word2->next;
        }
        return word1 == NULL && word2 == NULL;
    }
    
    int main(){
        NODE *word1, *word2;
        printf("input word : ");
        word1 = input_word();
        printf("input other word : ");
        word2 = input_word();
        if(isAnagram(word1, word2))
            printf("YES\n");
        else
            printf("NO\n");
        //drop(word1);drop(word2);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2019-07-10
      • 2015-12-23
      • 2019-11-20
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2012-11-07
      • 2019-01-17
      相关资源
      最近更新 更多