- 论坛徽章:
- 0
|
本帖最后由 freefly 于 2015-05-28 10:39 编辑
判断回文字符串是个比较经典的问题。
思路就是拿第一个字符和最一个字符比较,如果不等退出,相同的话继续刚刚的过程,直到第一个字符和最后一个字符相遇或者他们的距离为1时。说明他们是回文字符串。
下面的代码会忽略空白字符 如"1 1 2 1"会让为是回文字符串。
golang
- package main
- import (
- "fmt"
- "os"
- "strings"
- "unicode/utf8"
- )
- func doPalindrome(s string) bool {
- if utf8.RuneCountInString(s) <= 1 {
- return true
- }
- word := strings.Trim(s, "\t \r\n\v")
- first, sizeOfFirst := utf8.DecodeRuneInString(word)
- last, sizeOfLast := utf8.DecodeLastRuneInString(word)
- if first != last {
- return false
- }
- return doPalindrome(word[sizeOfFirst : len(word)-sizeOfLast])
- }
- func IsPalindrome(word string) bool {
- s := ""
- s = strings.Trim(word, "\t \r\n\v")
- if len(s) == 0 || len(s) == 1 {
- return false
- }
- return doPalindrome(s)
- }
- func main() {
- args := os.Args[1:]
- for _, v := range args {
- ok := IsPalindrome(v)
- if ok {
- fmt.Printf("%s\n", v)
- }
- }
- }
复制代码 clang 递归版:- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include <stdint.h>
- int do_palind(char *first, char *last) {
- /*跳过头部的空白字符*/
- while(*first && isspace(*first)) {
- first++;
- }
- /*跳过尾部的空白字符*/
- while (first < last && isspace(*last)) {
- last--;
- }
- if (last - first <= 0)
- return 1;
- if (*first != *last)
- return 0;
- return do_palind(++first, --last);
- }
- int ispalindrome(const char *str) {
- if (str[0] == '\0' || str[1] == '\0')
- return 0;
- //printf("---->%ld\n", strlen(str));
- return do_palind((char *)str, (char *)str + strlen(str) - 1);
- }
- int main(int argc, char **argv) {
- int is;
- while (*++argv) {
- is = ispalindrome(*argv);
- if (is)
- printf("%s\n", *argv);
- }
- }
复制代码 clang 循环版:- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- int ispalindrome(const char *str) {
- char *last;
- if (str[0] == '\0' || str[1] == '\0')
- return 0;
- last = (char *)str + strlen(str) - 1;
- while (str < last) {
- while (str < last && isspace(*str)) {
- str++;
- }
- while (str < last && isspace(*last)) {
- last--;
- }
- if (*str != *last)
- return 0;
- str++;
- last--;
- }
- return 1;
- }
- int main(int argc, char **argv) {
- int is;
- while (*++argv) {
- is = ispalindrome(*argv);
- if (is) {
- printf("%s\n", *argv);
- }
- }
- }
复制代码 |
|