我编写了一个C程序来查找两个字符串之间相似字符的数量。如果一个角色再次重复,它就不应该计算它。
就像你输入
一样everest
every
输出应为
3
因为四个字母"永远"是相同的,但重复的" e"不会增加计数。
输入
apothecary
panther
输出应为6,因为" apther",不计算第二个" a"。
我的代码似乎是一个短流程的批量代码。我的代码是
#include<stdio.h>
#include <stdlib.h>
int main()
{
char firstString[100], secondString[100], similarChar[100], uniqueChar[100] = {0};
fgets(firstString, 100, stdin);
fgets(secondString, 100, stdin);
int firstStringLength = strlen(firstString) - 1, secondStringLength = strlen(secondString) - 1, counter, counter1, count = 0, uniqueElem, uniqueCtr = 0;
for(counter = 0; counter < firstStringLength; counter++) {
for(counter1 = 0; counter1 < secondStringLength; counter1++) {
if(firstString[counter] == secondString[counter1]){
similarChar[count] = firstString[counter];
count++;
break;
}
}
}
for(counter = 0; counter < strlen(similarChar); counter++) {
uniqueElem = 0;
for(counter1 = 0; counter1 < counter; counter1++) {
if(similarChar[counter] == uniqueChar[counter1]) {
uniqueElem++;
}
}
if(uniqueElem == 0) {
uniqueChar[uniqueCtr++] = similarChar[counter];
}
}
if(strlen(uniqueChar) > 1) {
printf("%d\n", strlen(uniqueChar));
printf("%s", uniqueChar);
} else {
printf("%d",0);
}
}
有人可以提供一些建议或代码来缩短此功能吗?
答案 0 :(得分:2)
有一个简单的方法。获取一个数组并将ascii代码映射为该数组的索引。说int arr[256]={0}
;
现在,您在字符串-1中看到的任何字符都标记为1
。 arr[string[i]]=1
;标记第一个字符串中出现的字符。
现在,当循环遍历字符串-2的字符时,仅当 arr[string2[i]]++
为arr[i]
时才会增加1
的值。现在我们正在计算是的,这些角色也出现在这里。
现在检查数组中包含2
的位置数。这就是答案。
int arr[256]={0};
for(counter = 0; counter < firstStringLength; counter++)
arr[firstString[counter]]=1;
for(counter = 0; counter < secondStringLength; counter++)
if(arr[secondString[counter]]==1)
arr[secondString[counter]]++;
int ans = 0;
for(int i = 0; i < 256; i++)
ans += (arr[i]==2);
答案 1 :(得分:2)
你应该有2个数组来计算每个aplhabet的出现次数。
0, 1
循环遍历字符串并存储事件。
现在计算使用相似数量的字符:
int arrayCount1[26],arrayCount2[26];
答案 2 :(得分:1)
这是实现目标的简化方法。你应该创建一个数组来保存第一次看到的字符。
然后,你必须做两个循环。第一个是无条件的,而第二个是有条件的;该条件取决于您必须创建的变量,该变量检查天气是否已到达其中一个字符串的末尾。
当然,检查另一个字符串的结尾应该在第一个无条件循环内。您可以使用strchr()
函数来计算常见字符而不重复:
#include <stdio.h>
#include <string.h>
int foo(const char *s1, const char *s2);
int main(void)
{
printf("count: %d\n", foo("everest", "every"));
printf("count: %d\n", foo("apothecary", "panther"));
printf("count: %d\n", foo("abacus", "abracadabra"));
return 0;
}
int foo(const char *s1, const char *s2)
{
int condition = 0;
int count = 0;
size_t n = 0;
char buf[256] = { 0 };
// part 1
while (s2[n])
{
if (strchr(s1, s2[n]) && !strchr(buf, s2[n]))
{
buf[count++] = s2[n];
}
if (!s1[n]) {
condition = 1;
}
n++;
}
// part 2
if (!condition ) {
while (s1[n]) {
if (strchr(s2, s1[n]) && !strchr(buf, s1[n]))
{
buf[count++] = s1[n];
}
n++;
}
}
return count;
}
注意:您应该检查缓冲区溢出,并且应该使用动态方法相应地重新分配内存,但这是一个演示。