[英]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;
}
您可以:
您可以通過維護所有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.