免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2594 | 回复: 1
打印 上一主题 下一主题

[函数] golang 递归判断回文字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-28 10:33 |只看该作者 |倒序浏览
本帖最后由 freefly 于 2015-05-28 10:39 编辑

判断回文字符串是个比较经典的问题。

思路就是拿第一个字符和最一个字符比较,如果不等退出,相同的话继续刚刚的过程,直到第一个字符和最后一个字符相遇或者他们的距离为1时。说明他们是回文字符串。

下面的代码会忽略空白字符 如"1   1  2 1"会让为是回文字符串。

golang

  1. package main

  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. "unicode/utf8"
  7. )

  8. func doPalindrome(s string) bool {
  9. if utf8.RuneCountInString(s) <= 1 {
  10. return true
  11. }

  12. word := strings.Trim(s, "\t \r\n\v")
  13. first, sizeOfFirst := utf8.DecodeRuneInString(word)
  14. last, sizeOfLast := utf8.DecodeLastRuneInString(word)

  15. if first != last {
  16. return false
  17. }
  18. return doPalindrome(word[sizeOfFirst : len(word)-sizeOfLast])
  19. }

  20. func IsPalindrome(word string) bool {
  21. s := ""
  22. s = strings.Trim(word, "\t \r\n\v")
  23. if len(s) == 0 || len(s) == 1 {
  24. return false
  25. }
  26. return doPalindrome(s)
  27. }

  28. func main() {
  29. args := os.Args[1:]
  30. for _, v := range args {
  31. ok := IsPalindrome(v)
  32. if ok {
  33. fmt.Printf("%s\n", v)
  34. }
  35. }

  36. }
复制代码
clang  递归版:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <stdint.h>

  5. int do_palind(char *first, char *last) {
  6. /*跳过头部的空白字符*/
  7. while(*first && isspace(*first)) {
  8. first++;
  9. }
  10. /*跳过尾部的空白字符*/
  11. while (first < last && isspace(*last)) {
  12. last--;
  13. }

  14. if (last - first <= 0)
  15. return 1;

  16. if (*first != *last)
  17. return 0;

  18. return do_palind(++first, --last);
  19. }

  20. int ispalindrome(const char *str) {
  21. if (str[0] == '\0' || str[1] == '\0')
  22. return 0;
  23. //printf("---->%ld\n", strlen(str));
  24. return do_palind((char *)str, (char *)str + strlen(str) - 1);
  25. }

  26. int main(int argc, char **argv) {
  27. int is;
  28. while (*++argv) {
  29. is = ispalindrome(*argv);
  30. if (is)
  31. printf("%s\n", *argv);
  32. }
  33. }
复制代码
clang 循环版:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>

  4. int ispalindrome(const char *str) {
  5. char *last;

  6. if (str[0] == '\0' || str[1] == '\0')
  7. return 0;

  8. last = (char *)str + strlen(str) - 1;

  9. while (str < last) {
  10. while (str < last && isspace(*str)) {
  11. str++;
  12. }

  13. while (str < last && isspace(*last)) {
  14. last--;
  15. }

  16. if (*str != *last)
  17. return 0;
  18. str++;
  19. last--;
  20. }
  21. return 1;
  22. }

  23. int main(int argc, char **argv) {
  24. int is;
  25. while (*++argv) {
  26. is = ispalindrome(*argv);
  27. if (is) {
  28. printf("%s\n", *argv);
  29. }
  30. }
  31. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2015-09-13 17:30 |只看该作者
谢谢楼主分享。来支持你了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP