查询字符串的子序列

时间:2017-02-02 17:33:34

标签: java string

给定字符串S和Q查询,每个查询包含一个字符串T.如果T是S的子序列,则任务打印为“是”,否则打印“否”。 我正在尝试学习算法并实现它们。 我在Java中编写了以下代码:

import java.util.Stack;

public class QueriesOnStringSubsequence {
    public boolean subSequence(String original, String query) {
        Stack<Character> s1 = new Stack<Character>();
        Stack<Character> s2 = new Stack<Character>();

        for (int i = 0; i < original.length(); i++) {
            s1.push(original.charAt(i));
            System.out.println(s1.peek());
        }
        for (int i = 0; i < query.length(); i++) {
            s2.push(query.charAt(i));
            System.out.println(s2.peek());
        }
        while (!s1.isEmpty() || !s2.isEmpty()) {
            Character s1Top = s1.peek();
            Character s2Top = s2.peek();
            if (s1Top == s2Top) {
                s1.pop();
                //System.out.println(i);
                s2.pop();
                return true;
            }
            System.out.print("True");
        }
        System.out.print("False");
        return false;
    }

    public static void main(String[] args) {
        QueriesOnStringSubsequence ob = new QueriesOnStringSubsequence();
        ob.subSequence("geeksforgeeks", "gg");
    }
}

我尝试调试这个并且在Eclipse中它不会进入if条件。有人可以解释一下我的错误。

2 个答案:

答案 0 :(得分:1)

请注意,Stack是LIFO数据结构。

这意味着您运行时:

Character s1Top = s1.peek();
Character s2Top = s2.peek();

您正在添加最后两个字符。在这种情况下sg

这意味着不会满足if语句。第二次软件循环,因为您使用Stack.peek元素被查看但未更改。因此,while循环会一遍又一遍地查看sg。由于它们永远不会相等,因此永远不会满足if,因此您的while循环将是无限的。

你也在检查:

while(!s1.isEmpty() || !s2.isEmpty())

这意味着在退出之前两者都需要为空,这可能会导致问题。我相信你想用:

while(!s1.isEmpty() && !s2.isEmpty())

答案 1 :(得分:0)

正如邓肯所指出的,堆栈可能不是最好的数据结构。我假设您想要按顺序进行,这意味着您应该使用队列。

这是一个实现。我使用了更好的变量命名约定,这不仅有助于提高可读性,还有助于调试。

import java.util.*;

public class QueriesOnStringSubsequence {
    public static void subSequence(String original, String query) {
        Queue<Character> originalQueue = stringToQueue(original);
        Queue<Character> queryQueue = stringToQueue(query);

        while (!originalQueue.isEmpty() && !queryQueue.isEmpty()) {
            Character originalQueueHead = originalQueue.peek();
            Character queryQueueHead = queryQueue.peek();

            if (originalQueueHead.equals(queryQueueHead)) {
                queryQueue.poll();
                System.out.print("YES");
            } else {
                System.out.print("NO");
            }

            originalQueue.poll();
            System.out.print("...");
        }
    }

    private static Queue<Character> stringToQueue(String input) {
        Queue<Character> queue = new LinkedList<Character>();
        for (int i = 0; i < input.length(); i++) {
            queue.add(input.charAt(i));
        }
        return queue;
    }

    public static void main(String[] args) {
        QueriesOnStringSubsequence.subSequence("geeksforgeeks", "gg");
    }
}
  

... YES ... NO NO-NO-NO-NO-NO-NO-YES ...