题目

从标准输入读入一段英文短语,编写程序判定其是否属于回文(Palindrome)。判定前须完成数据清洗:剔除所有空格与标点符号,并统一转为小写。

输入格式:无需外部输入(测试短语 "A man, a plan, a canal: Panama")。

输出格式:输出清洗后的纯净字符序列及其回文对称性判定结果。

数据范围与约定:字符串清洗与对称检测。

思路与算法

1. 数据清洗逻辑索引
先用 lower() 统一小写;使用 isstrprop(s, "alphanum") 生成只包含字母数字的逻辑掩码,筛选出干净字符。

2. 回文对称判定
逆序序列为 clean_str(end:-1:1),利用 strcmp(clean_str, clean_str(end:-1:1)) 直接比对。

3. 时间复杂度
向量化清洗加逆序比对时间复杂度为 $O(N)$。

完整程序

% Octave / MATLAB 第79题:字符串回文检测
raw_phrase = "A man, a plan, a canal: Panama";

% 1. 转为小写
s_lower = lower(raw_phrase);

% 2. 提取字母数字 (过滤空格和标点)
mask_alpha = isstrprop(s_lower, "alpha");
clean_str  = s_lower(mask_alpha);

% 3. 翻转比对
rev_str = clean_str(end:-1:1);
is_palindrome = strcmp(clean_str, rev_str);

fprintf("原始短语: \"%s\"\n", raw_phrase);
fprintf("清洗字符: \"%s\"\n", clean_str);
fprintf("倒序字符: \"%s\"\n", rev_str);

if is_palindrome
    fprintf("判定结论: 是合法的回文字符串!\n");
else
    fprintf("判定结论: 不是回文字符串。\n");
end

运行示例

输出:

原始短语: "A man, a plan, a canal: Panama"
清洗字符: "amanaplanacanalpanama"
倒序字符: "amanaplanacanalpanama"
判定结论: 是合法的回文字符串!