解题思路
-
题目要求:
- 解析类似xcopy命令的参数
- 参数之间用空格分隔
- 对于带引号的参数,需要作为一个完整参数处理
- 输出参数个数和每个参数值
-
解题方法:
- 使用状态机处理字符串
- 特别处理引号内的内容
- 按规则分割参数
代码
def parse_command(command):
params = []
current_param = []
in_quotes = False
for char in command:
if char == '"': # 处理引号
in_quotes = not in_quotes
elif char == ' ' and not in_quotes: # 空格且不在引号内
if current_param:
params.append(''.join(current_param))
current_param = []
else: # 普通字符
current_param.append(char)
# 处理最后一个参数
if current_param:
params.append(''.join(current_param))
# 输出结果
print(len(params))
for param in params:
print(param)
while True:
try:
command = input().strip()
parse_command(command)
except:
break
import java.util.*;
public class Main {
public static void parseCommand(String command) {
List<String> params = new ArrayList<>();
StringBuilder currentParam = new StringBuilder();
boolean inQuotes = false;
for (char c : command.toCharArray()) {
if (c == '"') { // 处理引号
inQuotes = !inQuotes;
} else if (c == ' ' && !inQuotes) { // 空格且不在引号内
if (currentParam.length() > 0) {
params.add(currentParam.toString());
currentParam = new StringBuilder();
}
} else { // 普通字符
currentParam.append(c);
}
}
// 处理最后一个参数
if (currentParam.length() > 0) {
params.add(currentParam.toString());
}
// 输出结果
System.out.println(params.size());
for (String param : params) {
System.out.println(param);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String command = sc.nextLine().trim();
parseCommand(command);
}
}
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void parseCommand(string command) {
vector<string> params;
string currentParam;
bool inQuotes = false;
for (char c : command) {
if (c == '"') { // 处理引号
inQuotes = !inQuotes;
} else if (c == ' ' && !inQuotes) { // 空格且不在引号内
if (!currentParam.empty()) {
params.push_back(currentParam);
currentParam.clear();
}
} else { // 普通字符
currentParam += c;
}
}
// 处理最后一个参数
if (!currentParam.empty()) {
params.push_back(currentParam);
}
// 输出结果
cout << params.size() << endl;
for (const string& param : params) {
cout << param << endl;
}
}
int main() {
string command;
while (getline(cin, command)) {
parseCommand(command);
}
return 0;
}
算法分析
- 算法:状态机
- 时间复杂度:
,其中
为输入字符串长度
- 空间复杂度:
,需要存储解析后的参数