如何判断回文字符串?


如何通过sed命令判断回文字符串?

如:abba,level

方法一:
$ echo "abba" | sed -n '/\(.\)\(.\)\2\1/p'

可以判断长度为4的字符是否为回文。

$ echo "level" | sed -n '/\(.\)\(.\)\(.\)\2\1/p'

可以判断长度为5的字符是否为回文。

我稍微解释下,”\(.\)”代表了任意一个字符,”\(“是对”(“进行了转义,sed需要”\2″表示是对刚才匹配到的字符的反向引用,就好比是一个变量。\1就是反向引用第一个匹配到的,\2就是反向引用第2个匹配到的。

如果需要判断的字符数为偶数,比如为4个,则”\(.\)”就有2个,反向引用就是\2和\1;如果需要判断的字符数为奇数个,比如为5个,则”\(.\)”就有3个,反向引用就是\2和\1,中间的那个就不需要反向引用了,也就是\3没有必要判断。我们可以看到这个”\(.\)”的个数是和字符数的长度有关。

参考http://www.groad.net/bbs/simple/?t6847.html

补充源码:
#!/bin/bash

if [ $# -ne 2 ];
then
echo "Usage: $0 filename string_length"
exit -1
fi

filename=$1;

basepattern='/^(.)'
count=$(( $2 / 2 ))
for ((i=1; i<$count; i++))
do
basepattern=$basepattern'(.)';
done

if [ $(( $2 % 2 )) -ne 0 ];
then
basepattern=$basepattern'.';
fi
for ((count; count>0; count--))
do
basepattern=$basepattern''"$count";
done
basepattern=$basepattern'$/p'

sed -n "$basepattern" $filename

========
还有更简单的方法,即使用rev命令进行判断,rev命令是将字符串反向,源代码如下:

#!/bin/bash

while read word
do
if [[ "$word" == "$(echo $word | rev)" ]];
then
echo "$word is Palindrome"
fi
done < /usr/share/dict/british-english

sed并不能判断任意长度的“回文”


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注