给定字符串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条件。有人可以解释一下我的错误。
答案 0 :(得分:1)
请注意,Stack
是LIFO数据结构。
这意味着您运行时:
Character s1Top = s1.peek();
Character s2Top = s2.peek();
您正在添加最后两个字符。在这种情况下s
和g
。
这意味着不会满足if
语句。第二次软件循环,因为您使用Stack.peek
元素被查看但未更改。因此,while
循环会一遍又一遍地查看s
和g
。由于它们永远不会相等,因此永远不会满足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 ...