使用C语言提取子字符串及判断对称子字符串最大长度

先来看一个使用C语言从字符串中提取子字符串的基本方法总结:

#include <stdio.h>

/*处理中文字符*/
/*遍历字符串,非ASCII字符读取2个字节,ASCII读取一个字节,获取字符串长度*/
int StrLenU(const char* string)
{
   int len = 0 ;
   const char* p = string;
   while(*p++ != '\0')
   {
     if(*p > 0x80 || *p < 0)
     {
      p++;
     }
     len++;
   }
   return len;
}
/*遍历字符串,非ASCII字符读取2个字节,ASCII读取一个字节,返回指定位置的字符串指针,默认从1开始*/
char* StrSetPosU(const char* string,int pos)
{
   char* result;
   result = string;
   while (result != NULL && *result != '\0' && pos > 1)
   {
     if(*result > 0x80 || *result < 0)
     {
       result++;
     }
     result++;
     pos--;
   }
   if(pos!=0)
     return result;
   return '\0';
}
/*获取指定内存中的字符串个数,中文字符作为一个字符*/
int StrLenMemU(const char* string,int size)
{
   int len = 0 ;
   const char* p = string;
   while(*p++ != '\0' && size > 0)
   {
     if(*p > 0x80 || *p < 0)
     {
      p++;
      size--;
     }
     size-- ;
     len++;
   }
   return len;
}
/*可取中文字符串,当number为-1等负数时,取从start开始的剩余所有字符,默认从1开始*/
char* StringSubU(const char* string,int start,int number)
{
   int len = StrLenU(string) ;
   if(start>len)
   {
     printf("Start %d is too big than string length %d!\n",start,len);
     return NULL;
   }
   int bufsize = 0;
   int num = number;
   const char* p = string;
   const char* start_char =string;
   /*重置指针,获取指定开始位置*/
   p = StrSetPosU(string,start);
   start_char = p;
   /*当取值为负值时,则取全部值*/
   if(number < 0)
   {
     while(*p != '\0')
     {
      p++;
      bufsize++;
     }
   }
   else
   {
     while(1)
     {
      /*当指针移到末尾,而且还没有获取指定数的字符时,说明此时指定字符数过多,将会取剩下的所有值*/
      if(*p == '\0' && num > 0)
      {
        printf("Number : %d is to big!\n",number);
        break;
      }
      /*当num为0时,说明读取字符已经满足要求*/
      else if(num ==0 )
        break;
      /*当字符为ASCII时,*/
      if(*p > 0x80 || *p < 0)
      {
        bufsize++;
        p++;
      }
      bufsize++;
      p++;
      num--;
     }
   }
   num = bufsize;
   /*开始分配内存*/
   char* result ;
   result = (char*)malloc(sizeof(char)*(bufsize+1));
   memset(result,0,sizeof(char)*(bufsize+1));
   /*开始复制字符串*/
   int i = 0;
   int j = 0;
   while(num != 0)
   {
     result[i++] = start_char[j++];
     num--;
   }
   /*尾部置零*/
   result[bufsize] = '\0';
   return result;
}

int main()
{
   /*进行测试*/
   char* t = "a哈哈aab和c哈";
   printf("length: %d\n",StrLenU("哈哈a哈a哈"));
   printf("指向前%s\n指向后:%s\n",t,StrSetPosU(t,3));
   printf("全字符时字符个数:%d\n",StrLenMemU(t,6));
   printf("半个字符时字符个数:%d\n",StrLenMemU(t,4));
   printf("1.正常取值:%s\n",StringSubU("a哈aa哈a",1,2));
   printf("2.负值取值:%s\n",StringSubU("a哈aa哈a",-1,2));
   printf("3.起始值过大:%s\n",StringSubU("a哈aa哈a",7,2));
   printf("4.取值过大:%s\n",StringSubU("a哈aa哈a",5,3));
   printf("5.负值取全部:%s\n",StringSubU("a哈aa哈a",4,-1));

   return 0;
}

判断对称子字符串最大长度的方法

判断回文
先重写一个判断回文字串的方法,用指针实现,而不是数组了

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

  void isSymmetrical(char *str)
  {
    char *begin, *end;
    int flag, len = strlen(str); 

    for (begin = str, end = str + len - 1, flag = 1; begin <= end; begin ++, end --) {
      if (*begin != *end) {
        flag = 0;
        break;
      }
    } 

    if (flag)
      printf("Yes!\n");
    else
      printf("No!\n");
  } 

  int main(void)
  {
    char str[1001]; 

    while (gets(str)) {
      isSymmetrical(str);
    } 

    return 0;
  }

/**************************************************************
        Problem: 1192
        User: wangzhengyi
        Language: C
        Result: Accepted
        Time:10 ms
        Memory:912 kb
    ****************************************************************/

判断回文子串
判断子串是否为回文,可以考虑从内向外比较。例如字符串“google”,如果我们判断第二个字符o是对称的,只需要再向左、和向右各移一位就可以判断下一个字符串是否是对称的了
需要注意的一点是,针对原字符串中的每一个字符有两种情况:

以该字符为中心的对称分布,也就是回文子串为奇数
    以该字符和该字符前一个字符为中心的对称分布,也就是说回文子串是偶数

时间复杂度分析:

外层需要n - 1层循环,内层对于每个字符,都由中间向两边遍历一遍,为n,因此总的时间复杂度为O(n * n)

题目

题目描述: 
    输入一个字符串,输出该字符串中对称的子字符串的最大长度。 
    比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 
    输入: 
    存在多组数据,每组数据一行字符串,长度不大于100。 
    输出: 
    输出回文子串的最大长度。 
    样例输入: 
    google 
    样例输出: 
    4

ac代码

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

  /**
   * 最长回文字串的长度
   */
  void maxSymmetricalSubstring(char *str)
  {
    int maxlength, len;
    char *pre, *next, *current; 

    current = str + 1;
    maxlength = 0; 

    while (*current != '\0') {
      pre = current - 1;
      next = current + 1; 

      while (pre >= str && *next != '\0' && *pre == *next) {
        pre --;
        next ++;
      } 

      len = (next - 1) - (pre + 1) + 1; 

      if (len > maxlength) {
        maxlength = len;
      } 

      pre = current - 1;
      next = current; 

      while (pre >= str && *next != '\0' && *pre == *next) {
        pre --;
        next ++;
      }
      len = (next - 1) - (pre + 1) + 1; 

      if (len > maxlength) {
        maxlength = len;
      } 

      current ++;
    } 

    printf("%d\n", maxlength);
  }   

  int main(void)
  {
    char str[101]; 

    while (gets(str)) {
      maxSymmetricalSubstring(str);
    } 

    return 0;
  }

/**************************************************************
        Problem: 1252
        User: wangzhengyi
        Language: C
        Result: Accepted
        Time:0 ms
        Memory:912 kb
    ****************************************************************/

(0)

相关推荐

  • C语言切割多层字符串(strtok_r strtok使用方法)

    1. strtok介绍 众所周知,strtok可以根据用户所提供的分割符(同时分隔符也可以为复数比如",.")将一段字符串分割直到遇到"\0". 比如,分隔符="," 字符串="Fred,John,Ann" 通过strtok 就可以把3个字符串 "Fred"      "John"       "Ann"提取出来. 上面的C代码为 复制代码 代码如下: int in=

  • C语言字符串操作总结大全(超详细)

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1

  • 深入C语言把文件读入字符串以及将字符串写入文件的解决方法

    1.纯C实现 复制代码 代码如下: FILE *fp; if ((fp = fopen("example.txt", "rb")) == NULL) {  exit(0); } fseek(fp, 0, SEEK_END); int fileLen = ftell(fp); char *tmp = (char *) malloc(sizeof(char) * fileLen); fseek(fp, 0, SEEK_SET); fread(tmp, fileLen,

  • C语言实现将字符串转换为数字的方法

    本文实例讲述了C语言实现将字符串转换为数字的方法.分享给大家供大家参考.具体实现方法如下: C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型.长整型.浮点型等)的数字.以下是用atoi()函数将字符串转换为整数的一个例子: 复制代码 代码如下: # include <stdio. h> # include <stdlib. h> void main (void) ; void main (void) {     int num;     char * str = &qu

  • 在C语言中比较两个字符串是否相等的方法

    C语言strcmp()函数:比较字符串(区分大小写) 头文件:#include <string.h> strcmp() 用来比较字符串(区分大小写),其原型为: int strcmp(const char *s1, const char *s2); [参数]s1, s2 为需要比较的两个字符串. 字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值.strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回.例

  • c语言字符数组与字符串的使用详解

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串在c语言中,将字符串作为字符数组来处理.(c++中不是)在实际应用

  • C语言判断字符串是否以str2开头代码

    代码很简洁,功能也很简单,这里就不多废话了,直接把代码奉献给大家,有需要的小伙伴可以来参考下 #include <stdlib.h> #include <string.h> #include <stdio.h> /**判断str1是否以str2开头 * 如果是返回1 * 不是返回0 * 出错返回-1 * */ int is_begin_with(const char * str1,char *str2) { if(str1 == NULL || str2 == NULL

  • 使用C语言提取子字符串及判断对称子字符串最大长度

    先来看一个使用C语言从字符串中提取子字符串的基本方法总结: #include <stdio.h> /*处理中文字符*/ /*遍历字符串,非ASCII字符读取2个字节,ASCII读取一个字节,获取字符串长度*/ int StrLenU(const char* string) { int len = 0 ; const char* p = string; while(*p++ != '\0') { if(*p > 0x80 || *p < 0) { p++; } len++; } re

  • php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创

    本文实例讲述了php使用strpos判断字符串中数字类型子字符串出错的解决方法.分享给大家供大家参考,具体如下: 一.问题: 最近的开发中在程序代码里有一个随机数是否在给定字符串里的判断,我用了如下的测试代码: $string='中奖号码:3'; $numtmp=mt_rand(1,10); if(strpos($string,$numtmp)!==false){ echo "恭喜中奖!中奖号码:".$numtmp; }else{ echo "谢谢!欢迎再来,中奖号码不是&q

  • c语言输出字符串中最大对称子串长度的3种解决方案

    问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:"avvbeeb",该字符串中最长的子字符串是"beeb",长度为4,因而输出为4. 解决方法:中序遍历 一,全遍历的方法: 1.全遍历的方法,复杂度O(n3); 2.遍历原字符串的所有子串,然后判断每个子串是否对称: 实现方法是:我们让一个指针i从头至尾遍历,我们用另一个指针j从j=i+1逐一指向i后面的所有字符.就实现了原串的所有子串的遍历(子串为指针i到j中间的部分);最后判断得到的

  • JavaScript判断一个字符串是否包含指定子字符串的方法

    本文实例讲述了JavaScript判断一个字符串是否包含指定子字符串的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码,为String对象定义了一个contains方法用于判断字符串是否包含子字符串,非常有用. if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(obj, start) { for (var i = (start || 0), j = this.length; i < j; i++) {

  • PHP简单判断字符串是否包含另一个字符串的方法

    本文实例讲述了PHP简单判断字符串是否包含另一个字符串的方法.分享给大家供大家参考,具体如下: 在使用PHP判断某字符串中是否包含一个简单的子字符串的时候,我们通常会用到strpos()或者stristr()这两个函数,可是偏偏如果这个字符串的位置如果是在索引0位置,也就是说在要匹配的字符串的最开始,则会出问题. 当然我们还是有解决的方法的,这里就有一个笨办法,但是比较好用,无论中英文,标点符号都适用. 代码如下: function checkStr($str,$target) { $tmpAr

  • JS中判断某个字符串是否包含另一个字符串的五种方法

    String对象的方法 方法一: indexOf()   (推荐) var str = "123" console.log(str.indexOf("2") != -1); // true indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置.如果要检索的字符串值没有出现,则该方法返回 -1. 方法二:match() var str = "123" var reg = RegExp(/3/); if(str.match(reg

  • C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题

    正文  #方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个keyword都转成小写或大写再调用Contains方法: string key = "bbb"; string temp = "aaaBBBcccDDD"; bool isContains= temp.ToLower().Contains(key.ToLower()

  • java基础-给出一个随机字符串,判断有多少字母?多少数字?

    我这里用到了String类中的toarray[]方法. 当看到字符串和判断,我想到之前学过的c语言中判断字符数组中元素,我就去API中找字符串转换成数组的方法 实现方法不唯一,此方法仅作初学者(自己)参考..... 在String类中一共找到三个转数组的方法 很显然,第三个是想要的方法. 实现代码: package com.string; import java.util.Scanner; public class Character_Judge { public static void mai

  • python判断给定的字符串是否是有效日期的方法

    本文实例讲述了python判断给定的字符串是否是有效日期的方法.分享给大家供大家参考.具体分析如下: 这里python判断给定的字符串是否是一个有效的日期,如果是一个日期格式的字符串,该函数返回True,否则返回False def is_valid_date(str): '''判断是否是一个有效的日期字符串''' try: time.strptime(str, "%Y-%m-%d") return True except: return False 希望本文所述对大家的Python程序

  • 判断输入的字符串是否是日期格式的简单方法

    实例如下所示: function isDate(dateString){ if(dateString.trim()=="")return true; var r=dateString.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); if(r==null){ alert("请输入格式正确的日期\n\r日期格式:yyyy-mm-dd\n\r例 如:2008-08-08\n\r"); return false; } var

随机推荐