我们假设一个字母被换成另一个字母(M - > | V |,C - >()。 我们不知道每个字母都会被转换(这意味着我们不知道(M - > | V |,C - >() 如果有两个字符串和最大数字要转换这种字母。并且没有匹配的规则。
如果有界,则结果为1,否则为0。
起初我的解决方案就像这个C源
#include<stdio.h>
#include<string.h>
#define MAXSTRING 100
/**
Test input
2
3
mississippi
nni55i55ippi
2
foobar
|=o08ar
**/
int main() { // declare main function
int test,t; // test number
int i,j; // input loop variant
int lv1, lv2, lv3; // loop variant
int lenString1, lenString2; // length of string
int maximum; // maximum value for LEET
char letter; // check letters
char c1, c2;
scanf("%d\n", &t); // take test case
for(test = 0; test < t ; test ++) {
char string1[MAXSTRING]={0,}, string2[MAXSTRING]={0,};
int count1 = 0;
int result = 0;
int flipped = 0;
scanf("%d\n", &maximum);
for (i = 0; (c1 = getchar()) != '\n'; i++) { // make original string
string1[i] = c1;
}
for (j = 0; (c2 = getchar()) != '\n'; j++) { // make LEET string
string2[j] = c2;
}
lenString1 = strlen(string1);
lenString2 = strlen(string2);
if(lenString1 == 1 && string1[0] != string2[0]) { count1 = 1; }
else {
for (lv1 = 0; lv1 < lenString1; lv1++){
for (lv2 = lv1; lv2 < lenString2 ; lv2++) {
if(string1[lv1+1] == string2[lv2] && string1[lv1] != string2[lv2-1]) {
letter = string2[lv2-1];
for(lv3 = (lv1)+1; lv3 < lenString1; lv3++) {
if(string1[lv3] == string1[lv1] && string2[lv3] == letter) { flipped = 1; break;}
else { flipped = 0;}
}
count1++;
break;
}
if(flipped == 1) { break;}
else {flipped = 0;}
}
}
if(count1 > maximum) {result = 0;}
else {result = 1; }
}
printf("%d\n", count1);
printf("%d\n", result);
}
return 0;
}
但它不起作用。因为这种反例 如果最大值是3,那么这两种字符串。
ACMICPC - &gt; 4(| V | I(|&GT;(
我认为count1 = 4,但它数为1.
如何解决这类问题?
答案 0 :(得分:1)
您的代码正在计算相等的字符数。在你的反例中,你在两个字符串中只有一个I,因此count1是1。
在foobar示例中,你有A和R,count1 = 2.(我认为你在LEET版本中输错了0所以我不算Os,对吧?) 在密西西比州,你有I和P,count1 = 2。
但你并不是那么遥远。您可以做的是计算相似的字符,并从原始字符串中的唯一字符数中减去该计数。这将为您提供转换后的字符数。
只是抬头!我认为如果string1 [1] == string2 [0],你的程序将在第一次迭代(lv1 = lv2 = 0)时产生分段错误,因为它将查找string2 [-1]。