判断回文字符串是个比较经典的问题。
思路就是拿第一个字符和最一个字符比较,如果不相同就退出,相同的话继续刚刚的过程,直到第一个字符和最后一个字符相遇或者他们的距离为1时。说明他们是回文字符串。
下面的代码会忽略空白字符 如"1 1 2 1"会认为是回文字符串。
golang
- packagemain
- import(
- "fmt"
- "os"
- "strings"
- "unicode/utf8"
- )
- funcdoPalindrome(sstring)bool{
- ifutf8.RuneCountInString(s)<=1{
- returntrue
- }
- word:=strings.Trim(s,"\t\r\n\v")
- first,sizeOfFirst:=utf8.DecodeRuneInString(word)
- last,sizeOfLast:=utf8.DecodeLastRuneInString(word)
- iffirst!=last{
- returnfalse
- }
- returndoPalindrome(word[sizeOfFirst:len(word)-sizeOfLast])
- }
- funcIsPalindrome(wordstring)bool{
- s:=""
- s=strings.Trim(word,"\t\r\n\v")
- iflen(s)==0||len(s)==1{
- returnfalse
- }
- returndoPalindrome(s)
- }
- funcmain(){
- args:=os.Args[1:]
- for_,v:=rangeargs{
- ok:=IsPalindrome(v)
- ifok{
- fmt.Printf("%s\n",v)
- }
- }
- }
clang递归版:
- #include<stdio.h>
- #include<string.h>
- #include<ctype.h>
- #include<stdint.h>
- intdo_palind(char*first,char*last){
- /*跳过头部的空白字符*/
- while(*first&&isspace(*first)){
- first++;
- }
- /*跳过尾部的空白字符*/
- while(first<last&&isspace(*last)){
- last--;
- }
- if(last-first<=0)
- return1;
- if(*first!=*last)
- return0;
- returndo_palind(++first,--last);
- }
- intispalindrome(constchar*str){
- if(str[0]=='\0'||str[1]=='\0')
- return0;
- //printf("---->%ld\n",strlen(str));
- returndo_palind((char*)str,(char*)str+strlen(str)-1);
- }
- intmain(intargc,char**argv){
- intis;
- while(*++argv){
- is=ispalindrome(*argv);
- if(is)
- printf("%s\n",*argv);
- }
- }
clang 循环版:
- #include<stdio.h>
- #include<string.h>
- #include<ctype.h>
- intispalindrome(constchar*str){
- char*last;
- if(str[0]=='\0'||str[1]=='\0')
- return0;
- last=(char*)str+strlen(str)-1;
- while(str<last){
- while(str<last&&isspace(*str)){
- str++;
- }
- while(str<last&&isspace(*last)){
- last--;
- }
- if(*str!=*last)
- return0;
- str++;
- last--;
- }
- return1;
- }
- intmain(intargc,char**argv){
- intis;
- while(*++argv){
- is=ispalindrome(*argv);
- if(is){
- printf("%s\n",*argv);
- }
- }
- }