比较字符串的逻辑不正确?

时间:2014-03-22 03:16:59

标签: java regex for-loop boolean logic

这个程序应该比较" DNA"字符串。

输入:
3
ATGC
TACG
ATGC
CGTA
AGQ
TCF

第一行表示程序运行的次数。每次运行时,它都会比较两个字符串。与T匹配,反之亦然。 G与C匹配,反之亦然。因此,如果字符串1的第一个字母是A,则字符串2的第一个字母应为T.如果下一个字母为T,则另一个字符串中的下一个字母应为A等等。如果字母不是A,T, G或C出现,这是一个不好的样本。如果它不好,打印出来就不好,如果好的话,打印出来就好了。我尝试了许多不同的组合,它们都运行良好,但根据法官的测试数据(他们有不同的输入),它失败了。有没有人看到这个有什么问题?我知道这可能不是完成工作的最有效方式,但至少在我理解的情况下确实如此。

输出:
GOOD
BAD
坏了

public class DNA
{
    public static void main(String[] args) throws IOException
    {
        Scanner scan = new Scanner (new File ("dna.dat"));
        int T = scan.nextInt();
        scan.nextLine();
        boolean valid = true;
        for (int i = 0; i < T; i++)
        {
            String strand1 = scan.nextLine();
            strand1 = strand1.toUpperCase();
            String strand2 = scan.nextLine();
            strand2 = strand2.toUpperCase();
            for (int p = 0; p < strand1.length(); p++)
            {
                if (strand1.charAt(p) != 'A' && strand1.charAt(p) != 'T' && strand1.charAt(p) != 'G' && strand1.charAt(p) != 'C'
                    && strand2.charAt(p) != 'A' && strand2.charAt(p) != 'T' && strand2.charAt(p) != 'G' && strand2.charAt(p) != 'C')
                {
                    valid = false;
                    break;
                }
                if (strand1.length() != strand2.length())
                {
                    valid = false;
                    break;
                }
            }

            if (valid)
            {
                for (int p = 0; p < strand1.length(); p++)
                {
                    if ((strand1.charAt(p) == 'A' && strand2.charAt(p) == 'T') || (strand1.charAt(p) == 'T' && strand2.charAt(p) == 'A')
                         || (strand1.charAt(p) == 'G' && strand2.charAt(p) == 'C') || (strand1.charAt(p) == 'C' && strand2.charAt(p) == 'G'))
                        valid = true;
                    else
                        valid = false;
                }
            }
            if (valid)
                out.println("GOOD");
            else
                out.println("BAD");
            valid = true;
        }

    }
}

我添加了toUpperCase并比较了相同长度的字符串,就像最后一次尝试一样,看看他们的数据是否有一些小写字母或不同长度的字符串,尽管它们应该都是相同的长度和大写。尽管如此,该计划仍被拒绝,因为他们没有通过评委测试数据。&#34;

2 个答案:

答案 0 :(得分:1)

valid = false时,您需要在第二个for循环中断。例如,如果字符1,2,3错误但#4匹配,您仍然会有效。

我会将字符串转换为数组以使事情变得更容易:

for (int i = 0; i < T; i++)
{
    boolean valid = true;
    String strand1 = scan.nextLine();
    strand1 = strand1.toUpperCase();
    String strand2 = scan.nextLine();
    strand2 = strand2.toUpperCase();
    if ( strand1.length() != strand2.length())
    {
        valid = false;
    }
    if (valid) {
        char[] c1 = strand1.toCharArray();
        char[] c2 = strand2.toCharArray();

        for (int p = 0; p < c1.length; p++)
        {
            if (-1 == "ACTG".indexOf(c1[p]) || -1 == "ACTG".indexOf(c2[p]))
            {
                valid = false;
                break;
            }
        }

        if (valid)
        {
            for (int p = 0; p < c1.length; p++)
            {
                if (('A' == c1[p] && 'T' != c2[p]) ||
                    ('T' == c1[p] && 'A' != c2[p]) ||
                    ('C' == c1[p] && 'G' != c2[p]) ||
                    ('G' == c1[p] && 'C' != c2[p])) {
                    valid = false;
                    break;
                 }
            }
        }
    }
    if (valid)
        System.out.println("GOOD");
    else
        System.out.println("BAD");
}

答案 1 :(得分:0)

全部改变

&&

if (strand1.charAt(p) != 'A' && strand1.charAt(p) != 'T' && strand1.charAt(p) != 'G' && strand1.charAt(p) != 'C' && strand2.charAt(p) != 'A' && strand2.charAt(p) != 'T' && strand2.charAt(p) != 'G' && strand2.charAt(p) != 'C')

||

如果ANY,不是所有字符都不是A,T,G或C,那么我们退出循环。