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

标签 java regex for-loop boolean logic

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

输入:
3
ATGC
TACG
ATGC
CGTA
AGQ
TCF

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

输出:

不好
不好

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 并比较了相等长度的字符串,就像最后一次尝试查看它们的数据是否可能有一些小写字母或不同长度的字符串,尽管它们应该都是相同的长度和大写字母。尽管如此,该方案仍因“未通过评委测试数据”而被拒绝。

最佳答案

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");
}

关于java - 比较字符串的逻辑不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22573008/

相关文章:

java - 使用 Action 监听器设置目录

java - Jenkins 插件 : Select filled by model

javascript - 使用多个定界符和 Concat 拆分字符串

regex - 奇怪的 sed 输出

java - ServiceReference 未获取所有类名以进行激活

java - 将敏感数据从 C 传递到 Java

java - 用于查找字符串的正则表达式模式包含一些单词并且不包含其他单词

javascript - 创建循环 SetTimeOut Jquery 数组

c - C 中嵌套且可扩展的 for 循环

python - 循环创建多个图形后如何保存它们?