如何解决这个匹配算法?

时间:2011-11-20 04:26:12

标签: c algorithm

我们假设一个字母被换成另一个字母(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.

如何解决这类问题?

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]。

相关问题