C 两个字符串中相似字符的计数,不重复
我已经写了一个C程序来找出两个字符串之间相似字符的数目。如果某个字符再次重复,则不应将其计数 比如说,如果你输入C 两个字符串中相似字符的计数,不重复,c,string,C,String,我已经写了一个C程序来找出两个字符串之间相似字符的数目。如果某个字符再次重复,则不应将其计数 比如说,如果你输入 everest every 输出应该是 3 因为四个字母“ever”是相同的,但重复的“e”不会增加计数 输入 apothecary panther 输出应为6,因为“apther”,不计算第二个“a” 我的代码看起来像是一个短流程的批量代码。我的代码是 #include<stdio.h> #include <stdlib.h> int main()
everest
every
输出应该是
3
因为四个字母“ever”是相同的,但重复的“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);
}
}
#包括
#包括
int main()
{
字符firstString[100],secondString[100],similarChar[100],uniqueChar[100]={0};
fgets(第一串,100,标准输入);
fgets(第二串,100,标准输入);
int firstStringLength=strlen(firstString)-1,secondStringLength=strlen(secondString)-1,计数器,计数器1,计数=0,uniquelem,uniqueCtr=0;
用于(计数器=0;计数器1){
printf(“%d\n”,strlen(uniqueChar));
printf(“%s”,uniqueChar);
}否则{
printf(“%d”,0);
}
}
有人能为我提供一些缩短此函数的建议或代码吗?有一个简单的方法。取一个数组并将ascii码映射为该数组的索引。说
int-arr[256]={0}
现在,不管您在string-1中看到什么字符,请为此标记1
<代码>arr[string[i]=1;标记第一个字符串中出现的字符
现在,当循环字符串-2的字符时,仅当arr[i]
为1
时,才增加arr[string2[i]+
的值。现在我们正在计算,是的,这些字符也出现在这里
现在检查数组中有多少个位置包含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);
int-arr[256]={0};
用于(计数器=0;计数器
您应该有2个数组来记录每个aplhabet的出现次数
int arrayCount1[26],arrayCount2[26];
循环遍历字符串并存储引用
现在,要计算相似的字符数,请使用:
for( int i = 0 ; i < 26 ; i++ ){
similarCharacters = similarCharacters + min( arrayCount1[26], arrayCount2[26] )
}
for(int i=0;i<26;i++){
similarCharacters=similarCharacters+min(arrayCount1[26],arrayCount2[26])
}
以下是实现目标的简化方法。您应该创建一个数组来保存第一次看到的字符
然后,你必须做两个循环。第一种是无条件的,而第二种是有条件的;该条件取决于必须创建的变量,该变量检查是否已到达某个字符串的末尾
当然,检查另一个字符串的结尾应该在第一个无条件循环中。您可以使用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;
}
#包括
#包括
int foo(常量字符*s1,常量字符*s2);
内部主(空)
{
printf(“计数:%d\n”,foo(“珠穆朗玛峰”,“每个”);
printf(“计数:%d\n”,foo(“药剂师”、“黑豹”);
printf(“计数:%d\n”,foo(“算盘”,“abracadabra”);
返回0;
}
int foo(常量字符*s1,常量字符*s2)
{
int条件=0;
整数计数=0;
尺寸n=0;
char buf[256]={0};
//第一部分
while(s2[n])
{
if(strchr(s1,s2[n])&&!strchr(buf,s2[n]))
{
buf[count++]=s2[n];
}
如果(!s1[n]){
条件=1;
}
n++;
}
//第二部分
如果(!条件){
while(s1[n]){
if(strchr(s2,s1[n])&&!strchr(buf,s1[n]))
{
buf[count++]=s1[n];
}
n++;
}
}
返回计数;
}
注意:您应该检查缓冲区溢出,并且应该使用动态方法相应地重新分配内存,但这是一个演示。在示例输入中,您只有一个输入字符串。为什么输出为3?我数了4个相似/相同的字符。那么,如果输入的是“药剂师”和“黑豹”,那么计数会是6吗?“算盘”和“abracadabra”-3怎么样?是的,现在是4,但e又在重复。所以它应该把计数设为3。如果一个字符再次重复,则不应计数it@JonathanLeffler是的,计数是6,下一次是3是的!你能帮我查一下密码吗?我不明白最后一点。@RameshSekhar.:编辑。你现在就知道了。@RameshSekhar.:你选择的答案是假设。这更一般化了。当你选择答案时要小心。你能把我的全部代码都加在后面吗?这有点让人困惑:(什么让人困惑?你在假设哪个字符应该计数,只有26个。另一个答案更可靠,并且更进一步优化计数。根据问题中的样本输入,我唯一的假设是他只需要计算两个字符串之间的相似字母。问题没有“字符”“字母”,而不是“字母”,也不是“小写字母”。我数了至少两个,也许三个,y的假设