帮我分析以下代码。public static boolean checkSubstring(String input, String subs, int n) { if(input.length()<subs.length()){ if(n<=0) return true; else return false; } // recursive step else { if(input.substring(0, subs.length()).equals(subs)) n--; return checkSubstring(input.substring(1), subs, n); } }
时间: 2023-06-25 11:07:20 浏览: 116
这段代码实现的是检查字符串 input 中是否包含子字符串 subs,并且该子字符串出现的次数不超过 n 次。
代码首先判断 input 的长度是否小于 subs 的长度,如果是,则说明无法包含子字符串 subs,此时如果 n 小于等于0,返回 true,否则返回 false。
接下来是递归步骤,如果 input 的长度不小于 subs 的长度,就判断 input 的前 subs.length() 个字符是否与 subs 相等,如果相等,则将 n 减 1,并继续递归调用 checkSubstring 方法,传入 input 的子串(从第 2 个字符开始)和 subs 和 n。如果不相等,则继续递归调用 checkSubstring 方法,传入 input 的子串(从第 2 个字符开始)和 subs 和 n。
最终,如果递归调用完成后 n 大于等于 0,则返回 true,表示 input 包含子字符串 subs 并且出现次数不超过 n 次;否则返回 false,表示 input 不符合要求。
相关问题
import javax.swing.*; import java.awt.*; import java.util.stream.IntStream; public class PalindromeChecker extends JFrame { private JTextField inputField, outputField; private JButton recursiveButton, nonRecursiveButton; public PalindromeChecker() { setTitle("Palindrome Checker"); setSize(300, 150); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new GridLayout(3, 2)); panel.add(new JLabel("Input:")); inputField = new JTextField(); panel.add(inputField); panel.add(new JLabel("Output:")); outputField = new JTextField(); outputField.setEditable(false); panel.add(outputField); recursiveButton = new JButton("Check Recursively"); recursiveButton.addActionListener(e -> checkPalindrome(true)); panel.add(recursiveButton); nonRecursiveButton = new JButton("Check Non-Recursively"); nonRecursiveButton.addActionListener(e -> checkPalindrome(false)); panel.add(nonRecursiveButton); setContentPane(panel); setVisible(true); } private void checkPalindrome(boolean isRecursive) { String input = inputField.getText(); if (isPalindrome(input, isRecursive)) { outputField.setText("It is a palindrome."); } else { outputField.setText("It is not a palindrome."); } } private boolean isPalindrome(String input, boolean isRecursive) { if (isRecursive) { return isPalindromeRecursive(input); } else { return isPalindromeNonRecursive(input); } } private boolean isPalindromeRecursive(String input) { if (input.length() <= 1) { return true; } else if (input.charAt(0) == input.charAt(input.length() - 1)) { return isPalindromeRecursive(input.substring(1, input.length() - 1)); } else { return false; } } private boolean isPalindromeNonRecursive(String input) { int length = input.length(); return IntStream.range(0, length / 2) .noneMatch(i -> input.charAt(i) != input.charAt(length - i - 1)); } public static void main(String[] args) { new PalindromeChecker(); } }给上述代码标注注释
//导入 java.swing 包和 java.awt 包以及 java.util.stream.IntStream;
import javax.swing.*;
import java.awt.*;
import java.util.stream.IntStream;
//创建一个 PalindromeChecker 类,继承自 JFrame 类
public class PalindromeChecker extends JFrame {
//创建输入框、输出框和两个按钮的成员变量
private JTextField inputField, outputField;
private JButton recursiveButton, nonRecursiveButton;
//构造函数,设置窗口标题、大小、关闭操作和布局
public PalindromeChecker() {
setTitle("Palindrome Checker");
setSize(300, 150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建一个面板,采用 3 行 2 列的格子布局,并添加标签、输入框、输出框和两个按钮
JPanel panel = new JPanel(new GridLayout(3, 2));
panel.add(new JLabel("Input:"));
inputField = new JTextField();
panel.add(inputField);
panel.add(new JLabel("Output:"));
outputField = new JTextField();
outputField.setEditable(false);
panel.add(outputField);
recursiveButton = new JButton("Check Recursively");
recursiveButton.addActionListener(e -> checkPalindrome(true)); //添加递归按钮的事件监听器
panel.add(recursiveButton);
nonRecursiveButton = new JButton("Check Non-Recursively");
nonRecursiveButton.addActionListener(e -> checkPalindrome(false)); //添加非递归按钮的事件监听器
panel.add(nonRecursiveButton);
//将面板设置为窗口内容面板,并设置窗口可见
setContentPane(panel);
setVisible(true);
}
//检查回文字符串的方法,根据参数决定使用递归或者非递归方式
private void checkPalindrome(boolean isRecursive) {
String input = inputField.getText(); //获取输入框中的字符串
if (isPalindrome(input, isRecursive)) { //判断是否为回文字符串
outputField.setText("It is a palindrome."); //如果是,输出 "It is a palindrome."
} else {
outputField.setText("It is not a palindrome."); //如果不是,输出 "It is not a palindrome."
}
}
//判断字符串是否为回文字符串的方法,根据参数决定使用递归或者非递归方式
private boolean isPalindrome(String input, boolean isRecursive) {
if (isRecursive) { //如果使用递归方式
return isPalindromeRecursive(input); //调用递归方法
} else { //如果使用非递归方式
return isPalindromeNonRecursive(input); //调用非递归方法
}
}
//递归方式判断字符串是否为回文字符串的方法
private boolean isPalindromeRecursive(String input) {
if (input.length() <= 1) { //字符串长度小于等于 1 时,返回 true
return true;
} else if (input.charAt(0) == input.charAt(input.length() - 1)) { //如果首尾字符相同
return isPalindromeRecursive(input.substring(1, input.length() - 1)); //递归调用本方法,传入去除首尾字符后的子串
} else {
return false;
}
}
//非递归方式判断字符串是否为回文字符串的方法
private boolean isPalindromeNonRecursive(String input) {
int length = input.length(); //获取字符串长度
return IntStream.range(0, length / 2) //对于从 0 到 length/2 的每个整数 i,执行如下操作
.noneMatch(i -> input.charAt(i) != input.charAt(length - i - 1)); //如果存在不等的字符,返回 false;否则返回 true
}
//主函数,创建一个 PalindromeChecker 对象
public static void main(String[] args) {
new PalindromeChecker();
}
}
完善代码:public class LLParserExample { // 预测分析表 private Map<String, Map<String, String>> parseTable; private String startSymbolMap; private String []terminalSymbol; public LLParserExample(String startSymbolMap, String []terminalSymbol, Map<String, Map<String, String>> parseTable) { this.parseTable = parseTable; this.startSymbolMap = startSymbolMap; this.terminalSymbol = terminalSymbol; } public boolean parse(String input) { return false; } // 判断符号是否是终结符 private boolean isTerminal(String symbol) { for (int i=0; i<this.terminalSymbol.length ; i++) { if(this.terminalSymbol[i].equals(symbol)) return true; } return false; } public static void main(String[] args) { //文法终结符号集合 String []tSymbols = {"a","b"}; // 初始化预测分析表 Map<String, Map<String, String>> parseTable; parseTable = new HashMap<>(); Map<String, String> row1 = new HashMap<>(); row1.put("a", "A->aB"); row1.put("b", "A->b"); parseTable.put("A", row1); Map<String, String> row2 = new HashMap<>(); row2.put("a", "B->a"); row2.put("b", "B->bA"); parseTable.put("B", row2); //初始化LL(1)分析器 LLParserExample parser = new LLParserExample("A", tSymbols, parseTable); //分析input是否为文法的一个句子并输出产生式序列 String input = "abaa"; boolean success = parser.parse(input); if (success) { System.out.println("分析成功"); } else { System.out.println("分析失败"); } } }
public class LLParserExample {
// 预测分析表
private Map<String, Map<String, String>> parseTable;
private String startSymbolMap;
private String[] terminalSymbol;
public LLParserExample(String startSymbolMap, String[] terminalSymbol, Map<String, Map<String, String>> parseTable) {
this.parseTable = parseTable;
this.startSymbolMap = startSymbolMap;
this.terminalSymbol = terminalSymbol;
}
public boolean parse(String input) {
Stack<String> stack = new Stack<>();
stack.push("$"); // 将结束符号入栈
stack.push(this.startSymbolMap); // 将文法的开始符号入栈
int index = 0; // 输入串的指针
while (!stack.isEmpty()) {
String top = stack.pop(); // 栈顶元素出栈
if (this.isTerminal(top)) { // 如果栈顶为终结符
if (top.equals("$")) { // 如果栈顶为结束符号
return input.charAt(index) == '$'; // 如果输入串也为结束符号,则分析成功
}
if (top.equals(String.valueOf(input.charAt(index)))) { // 如果栈顶与输入串指针所指字符相同
index++; // 输入串指针后移
} else {
return false; // 分析失败
}
} else { // 如果栈顶为非终结符
Map<String, String> row = this.parseTable.get(top); // 获取预测分析表中该非终结符对应的一行
String production = row.get(String.valueOf(input.charAt(index))); // 获取该行中与输入串指针所指字符相对应的产生式
if (production == null) { // 如果找不到对应的产生式
return false; // 分析失败
}
String[] symbols = production.split("->")[1].split(""); // 获取产生式右部的符号序列
for (int i = symbols.length - 1; i >= 0; i--) { // 将产生式右部的符号序列逆序入栈
stack.push(symbols[i]);
}
}
}
return false; // 分析失败
}
// 判断符号是否是终结符
private boolean isTerminal(String symbol) {
for (int i = 0; i < this.terminalSymbol.length; i++) {
if (this.terminalSymbol[i].equals(symbol))
return true;
}
return false;
}
public static void main(String[] args) {
// 文法终结符号集合
String[] tSymbols = {"a", "b"};
// 初始化预测分析表
Map<String, Map<String, String>> parseTable;
parseTable = new HashMap<>();
Map<String, String> row1 = new HashMap<>();
row1.put("a", "A->aB");
row1.put("b", "A->b");
parseTable.put("A", row1);
Map<String, String> row2 = new HashMap<>();
row2.put("a", "B->a");
row2.put("b", "B->bA");
parseTable.put("B", row2);
// 初始化LL(1)分析器
LLParserExample parser = new LLParserExample("A", tSymbols, parseTable);
// 分析input是否为文法的一个句子并输出产生式序列
String input = "abaa";
boolean success = parser.parse(input);
if (success) {
System.out.println("分析成功");
} else {
System.out.println("分析失败");
}
}
}
阅读全文