寻找回文字符串

★什么是回文串

就是正读与反读都相同的字符串。像werrrew这样的字符串。

★寻找字符串中最长的回文串

◇需要解决的问题

1、字符串输入与保存

字符串的输入函数有好多个,但是各自都有各自的限制。

scanf函数遇到“空格”和“TAB”键就终止输入;

getchar函数输入单个字符;

gets函数虽然能输入字符串,但是却没有指明读取的最大字符串数,很有可能读写到非法内存!

fgetc(stdin)与getchar函数等价

fgets(buf,MANX,stdin)则可以读取一整行放到数组buf中,因为此函数读到‘\n’时就会停止。

2、字母以外的字符处理

判断时忽略标点符号。可以使用函数isalpha(),此函数可以判断字符是否为字母。同时可以使用toupper()函数将大小写字母转化为同样的字母。该函数的头文件都为ctype.h

3、判断回文串

回文串的判断方法:可以从两边向内判断,也可以从内向两边判断

◇代码设计

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAXN 5000 + 10

int main()
{
    char buf_a[MAXN],buf_b[MAXN];
    int i,j,k,len,max,x,y,p[MAXN];
    fgets(buf_a,sizeof(buf_a),stdin);
    len = strlen(buf_a);

    k = 0;
    for(i = 0;i < len;i++)
    {
        if(isalpha(buf_a[i]))
        {
            buf_b[k] = toupper(buf_a[i]);
            p[k++] = i;
        }
    }

    max = 0;
    for(i = 0;i < len;i++)
    {
        for(j = 0;j <= i && i+j < len;j++)
        {
            if(buf_b[i-j] != buf_b[i+j]) break;
            if(max < 2*j+1)
            {
                max = 2*j+1;
                x = p[i-j];
                y = p[i+j];
            }
        }
        for(j = 0;j <= i && i+j+1<len;j++)
        {
            if(buf_b[i-j] != buf_b[i+j+1]) break;
            if(max < 2*(j+1))
            {
                max = 2*(j+1);
                x = p[i-j];
                y = p[i+j+1];
            }
        }
    }
    for(i = x;i <= y;i++)
    {
        printf("%c",buf_a[i]);

    }
    return 0;
}

★总结

◇思考

思考后得到的东西才是自己的,理解的也深刻,这也是学习能力的关键!遇到问题时不要急于寻求答案,可以将它看作为一次自我挑战,坚持独立思考,持续思考,问题多解,相信最终会受益的!

◇分析问题

我们遇到问题的阻碍之时,不能笼统的最自己说:这个问题我解决不了!我们要做的时分析,那么应该怎样分析呢?

1、拆分问题

一个问题解决不了,可能是因为其中的一个小问题的阻碍。就像上述问题,就起码包括三个小问题!多字符串的输入、字符串的处理、回文串的判断!正确的将问题拆分,将有利于问题的解决。

2、正确描述问题

正确的描述出自己所遇到的问题,有益于问题的解决!常问自己:我遇到的问题到底是什么?要解决这个问题还缺少什么?

3、确定问题的属性

知识层面的问题就是书本上或者网上能轻易查找到的!像什么叫回文串?

逻辑层面的问题必须通过自己的总结或者推理去探索的,不能够在书本或者网上轻易找到的问题!而逻辑层面的问题要比知识层面的问题要重要的多,也是重点去解决的问题

◇善于总结

要习惯将类似的知识点去做一下对比,找出各自的限制。区分相同点和不同点,这样会对知识有更深的了解!

◇问题多解

时间: 2024-11-06 17:38:04

寻找回文字符串的相关文章

寻找最长回文字符串

首先讲解一种简单容易理解的暴力解法:复杂度为O(n^2) 解题思路是:第一,定义一个pStr指向字符串str,再定义一个p指向pStr,q指向pStr+1: 第二,找出一个字符*p与其下一个字符*q相同位置,比如oo,num++,index = p:然后比较这两个相同字符*p,*q两边的字符是否相等,如果相等再向两边扩展p--,q++(p>str&&q!='\0').如果p指向首部,即p=str,则调出while循环,再比较一次if(*p == *q),num++,index = q

判断一个字符串是否为回文字符串

#include <stdio.h> #include <assert.h> #include <string.h> int is_pal_str(const char *p) {  assert(p);  int len = strlen(p);  const char *start = p;  const char *end = p+len - 1;  while (start < end)  {   if (*start == *end)   {    st

【LeetCode-面试算法经典-Java实现】【05-Longest Palindromic Substring(最大回文字符串)】

背景 近期開始研究算法,于是在leetcode上做算法题,第五题Longest Palindromic Substring便是关于回文子串的. 什么是回文字串 回文字符串是指将该字符串前后颠倒之后和该字符串一样的字符串.比如:a,aaaa,aba,abba- 最长回文子串 要求最长回文子串,就须要遍历每个子串,时间复杂度是O(N2):推断字串是不是回文,时间复杂度是O(N),这种话算法的时间复杂度就是O(N3). 我刚開始想到的就是中心扩展法,代码例如以下: public static Stri

判断是否是回文字符串(Java实现)

1.回文的定义:“回文数”就是正读倒读都一样的整数.如奇数个数字:98789,这个数字正读是98789 倒读也是98789.偶数个数字3223也是回文数.字母 abcba 也是回文. 2. 判断一个字符串是否是回文字符串(Java实现) 1 public class Test4 { 2 public static boolean isHuiWen(String text) { 3 int length = text.length(); 4 for (int i = 0; i < length /

寻找回文数的python的实现

寻找回文数 寻找回文数也是一个比较好玩的题目,也是学习python的一个简单的filter()函数的应用 解决方法:即按照回文数的特点进行即可. 方法一:一行代码解决 #coding=UTF-8 #寻找回文数 def is_palindrome(n): s=str(n) return s[0:len(s)//2]==s[-1:len(s)//2:-1] #return str(n)==str(n)[::-1] #测试 for i in filter(is_palindrome,range(100

shell脚本实现检测回文字符串

所有回文字的结构特征如下: 如果字符数是偶数,那么它在结构上表现为:一个字符序列连着另一个字符相同但次序恰好相反的字符序列. 如果字符数为奇数,那么它在结构上表现为:一个字符序列连着另一个字符相同但次序恰好相反的字符序列,但是这两个序列中间共享一个相同的字符. sed命令能够记住之前匹配的子样式.可以用正则表达式:'\(.\)',匹配任意一个字符,\1表示其反向引用.如匹配有两个字符的回文正则表达式为: '\(.\)\(.\)\2\1' 匹配任意长度的回文脚本如下所示: #!/bin/bash

最长回文字符串 POJ3974

曾经有一个好算法放到我面前,我没有好好珍惜,直到用到的时候才后悔莫及. 那就是Manacher(马拉车算法),以O(n)的复杂度计算最长回文字符串. 曾经刷Leetcode的时候,室友跟我说了这个算法,但当时那个题目用中间枚举也过了,我就没有在意,直到前天才弄会,写这篇报告之前, 我又专门写了一遍马拉车,果然还是有点问题的. 详细原理链接 点击 Mark #include <stdio.h> #include <iostream> #include <string.h>

Java Longest Palindromic Substring(最长回文字符串)

假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padromic string. 下边提供3种思路 1.两側比較法 以abba这样一个字符串为例来看,abba中,一共同拥有偶数个字.第1位=倒数第1位.第2位=倒数第2位......第N位=倒数第N位 以aba这样一个字符串为例来看,aba中.一共同拥有奇数个字符.排除掉正中间的那个字符后,第1位=倒数第1

131. 132. Palindrome Partitioning *HARD* -- 分割回文字符串

131. Palindrome Partitioning Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab",Return [ ["aa","b"], ["