簡體   English   中英

查找2個字符串是否由相同字母組成

[英]Find if 2 strings are composed of same letters

我有一個問題,如果這個功能應該返回1, secret是由相同的字母比letters_guessed

只要letters_guessed至少有1個相同的secret字母,它就可以正常工作。 如果相同字母2次以上,則不起作用。 我知道為什么,但是我無法解決它,因為我無法刪除相同的字母。 我不能從letters_guessed數組中刪除相同的字母,因為它是常量,因此無法將其更改為非常量。

再次...

如果:

secret = "cat"

letters_guessed = "txaoc"

return 1

**Right**

If:

secret = "dog"

letters_guessed = "gefxd"

return 0 

**Right**

If:

secret = "car"

letters_guessed = "ccr"

return 1

**Wrong, How can I solve this?**

對不起,我的英語不好,再加上冗長的解釋。 這是我的程序:

 int is_word_guessed(const char secret[], const char letters_guessed[])
    {
    int same = 0;
    for(int i = 0; i < strlen(letters_guessed); i++)
    {
        for(int j = 0; j < strlen(secret); j++)
        {
            if(letters_guessed[i] == secret[j])
                same++;
        }
    }
    if (same == strlen(secret))
        return 1;
    else 
        return 0;
    }

您可以:

  • 復制您的字符串以標記已經計數的字母(因為您告訴您不想修改字符串,因此建議您先復制一個副本以丟棄已計數的字母);
  • 獲取字符串的排序版本,然后將其與單個循環進行比較; 此解決方案還將提供更好的復雜性(您可以獲得O(n log n)而不是當前的O(n ^ 2) )。

您可以通過維護所有26個字母組成的數組將迭代保留在內存中。

假設:-所有字母均應小寫。 機密不應該重復字母。

邏輯:-如果我們考慮過該字母,則將數組條目設置為1。 97是'a'的ascii值

//聲明頭文件

#include "string.h"


int is_word_guessed(const char secret[], const char letters_guessed[])
{
    int same = 0;

    int alphabets[26];
    // make all enteries 0
    for (int k = 0; k <= 25; k++)
    {
        alphabets[k] = 0;
    }

    for (int i = 0; i < strlen(letters_guessed); i++)
    {
        for (int j = 0; j < strlen(secret); j++)
        {
            if (letters_guessed[i] == secret[j] && (alphabets[(char)letters_guessed[i] - 97] == 0))
            {
                same++;
                alphabets[(char)letters_guessed[i] - 97] = 1;
            }
        }
    }
    if (same == strlen(secret))
        return 1;
    else
        return 0;
}

一種無需修改字符串的方法是對字符串中字母的出現進行計數。 當猜測中出現的字母多於秘密時,那就是錯過了。 在秘密中不存在猜測中出現字母的情況只是一種特殊情況,因為秘密中出現的次數為零。

在實踐中,您不會保留兩個單獨的計數:首先將猜測的字母添加到計數中,然后刪除秘密的字母。 一旦一個計數下降到零以下,那就太錯過了。

您可以利用只有256個不同字符的事實,並將計數保留在數組中。 數組的索引是字母的ASCII碼。 注意不要訪問負索引的數組。 C的char不能保證是無符號的,因此您可以將其強制轉換或使用無符號的臨時變量,或者選擇不考慮負值。

這是一個實現:

int contains(const char *guess, const char *secret)
{
    int count[256] = {0};               // start with all-zero array

    while (*guess) {
        unsigned char c = *guess++;

        count[c]++;
    }

    while (*secret) {
        unsigned char c = *secret++;

        if (count[c] == 0) return 0;
        count[c]--;
    }

    return 1;
}

這很容易。
在Haskell中,它將是:

all (`elem` letters_guessed) secret

換句話說:所有秘密字符必須以字母猜測。

在C中(未經測試):

// Iterate though string 'secret' until there is a char not
// part of 'letters_guessed'. If there is none, return 1
unsigned check(char *secret, char *letters_guessed) {
  unsigned length_secret = length(secret);
  unsigned length_guessed = length(letters_guessed);

  for (int i = 0; i < length_secret; i++) {
    if (!elem(secret[i], letters_guessed) {
      return 0;
    }
  }

  return 1;
}

// Check if char 'current' is part of 'string'
unsigned elem(char current, char *string) {
  unsigned length = length(string);
  unsigned found = 0;

  for (int i = 0; i < length; i++) {
    if (current == string[i]) {
      return 1;
    }
  }

  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM