最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C語言提取子字符串及判斷對稱子字符串最大長度

 更新時(shí)間:2015年08月11日 10:21:09   作者:zinss26914  
這篇文章主要介紹了使用C語言提取子字符串及判斷對稱子字符串最大長度,文后附送了一道ACM競賽題目,需要的朋友可以參考下

先來看一個(gè)使用C語言從字符串中提取子字符串的基本方法總結(jié):

#include <stdio.h>

/*處理中文字符*/
/*遍歷字符串,非ASCII字符讀取2個(gè)字節(jié),ASCII讀取一個(gè)字節(jié),獲取字符串長度*/
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個(gè)字節(jié),ASCII讀取一個(gè)字節(jié),返回指定位置的字符串指針,默認(rèn)從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';
}
/*獲取指定內(nèi)存中的字符串個(gè)數(shù),中文字符作為一個(gè)字符*/
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;
}
/*可取中文字符串,當(dāng)number為-1等負(fù)數(shù)時(shí),取從start開始的剩余所有字符,默認(rèn)從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;
   /*當(dāng)取值為負(fù)值時(shí),則取全部值*/
   if(number < 0)
   {
     while(*p != '\0')
     {
      p++;
      bufsize++;
     }
   }
   else
   {
     while(1)
     {
      /*當(dāng)指針移到末尾,而且還沒有獲取指定數(shù)的字符時(shí),說明此時(shí)指定字符數(shù)過多,將會(huì)取剩下的所有值*/
      if(*p == '\0' && num > 0)
      {
        printf("Number : %d is to big!\n",number);
        break;
      }
      /*當(dāng)num為0時(shí),說明讀取字符已經(jīng)滿足要求*/
      else if(num ==0 )
        break;
      /*當(dāng)字符為ASCII時(shí),*/
      if(*p > 0x80 || *p < 0)
      {
        bufsize++;
        p++;
      }
      bufsize++;
      p++;
      num--;
     }
   }
   num = bufsize;
   /*開始分配內(nèi)存*/
   char* result ;
   result = (char*)malloc(sizeof(char)*(bufsize+1));
   memset(result,0,sizeof(char)*(bufsize+1));
   /*開始復(fù)制字符串*/
   int i = 0;
   int j = 0;
   while(num != 0)
   {
     result[i++] = start_char[j++];
     num--;
   }
   /*尾部置零*/
   result[bufsize] = '\0';
   return result;
}

int main()
{
   /*進(jìn)行測試*/
   char* t = "a哈哈aab和c哈";
   printf("length: %d\n",StrLenU("哈哈a哈a哈"));
   printf("指向前%s\n指向后:%s\n",t,StrSetPosU(t,3));
   printf("全字符時(shí)字符個(gè)數(shù):%d\n",StrLenMemU(t,6));
   printf("半個(gè)字符時(shí)字符個(gè)數(shù):%d\n",StrLenMemU(t,4)); 
   printf("1.正常取值:%s\n",StringSubU("a哈aa哈a",1,2));
   printf("2.負(fù)值取值:%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.負(fù)值取全部:%s\n",StringSubU("a哈aa哈a",4,-1));

   return 0;
}

判斷對稱子字符串最大長度的方法

判斷回文
先重寫一個(gè)判斷回文字串的方法,用指針實(shí)現(xiàn),而不是數(shù)組了

  #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
    ****************************************************************/ 


判斷回文子串
判斷子串是否為回文,可以考慮從內(nèi)向外比較。例如字符串“google”,如果我們判斷第二個(gè)字符o是對稱的,只需要再向左、和向右各移一位就可以判斷下一個(gè)字符串是否是對稱的了
需要注意的一點(diǎn)是,針對原字符串中的每一個(gè)字符有兩種情況:

    以該字符為中心的對稱分布,也就是回文子串為奇數(shù)
    以該字符和該字符前一個(gè)字符為中心的對稱分布,也就是說回文子串是偶數(shù)


時(shí)間復(fù)雜度分析:

外層需要n - 1層循環(huán),內(nèi)層對于每個(gè)字符,都由中間向兩邊遍歷一遍,為n,因此總的時(shí)間復(fù)雜度為O(n * n)

題目

    題目描述: 
    輸入一個(gè)字符串,輸出該字符串中對稱的子字符串的最大長度。 
    比如輸入字符串“google”,由于該字符串里最長的對稱子字符串是“goog”,因此輸出4。 
    輸入: 
    存在多組數(shù)據(jù),每組數(shù)據(jù)一行字符串,長度不大于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
    ****************************************************************/ 

相關(guān)文章

  • 利用C++實(shí)現(xiàn)簡易的.ini配置文件解析器

    利用C++實(shí)現(xiàn)簡易的.ini配置文件解析器

    這篇文章主要為大家詳細(xì)介紹了如何基于C++編寫一個(gè)簡易的.ini配置文件解析器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • 詳解C++ 多態(tài)的兩種形式(靜態(tài)、動(dòng)態(tài))

    詳解C++ 多態(tài)的兩種形式(靜態(tài)、動(dòng)態(tài))

    這篇文章主要介紹了C++ 多態(tài)的兩種形式,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C/C++實(shí)現(xiàn)樹操作的實(shí)例代碼

    C/C++實(shí)現(xiàn)樹操作的實(shí)例代碼

    這篇文章主要介紹了C/C++實(shí)現(xiàn)樹操作的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Qt編寫顯示密碼強(qiáng)度的控件

    Qt編寫顯示密碼強(qiáng)度的控件

    這篇文章主要為大家詳細(xì)介紹了Qt編寫顯示密碼強(qiáng)度的控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C/C++獲取當(dāng)前時(shí)間的方法總結(jié)(最全)

    C/C++獲取當(dāng)前時(shí)間的方法總結(jié)(最全)

    這篇文章主要為大家整理了C/C++中獲取當(dāng)前時(shí)間的最全方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和借鑒價(jià)值,需要的可以了解一下
    2023-03-03
  • C語言關(guān)于注釋的知識點(diǎn)總結(jié)

    C語言關(guān)于注釋的知識點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于C語言關(guān)于注釋的知識點(diǎn)總結(jié),需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • C語言實(shí)例問題探究字符串函數(shù)的應(yīng)用

    C語言實(shí)例問題探究字符串函數(shù)的應(yīng)用

    字符串函數(shù)(String processing function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長度,字符查找等的函數(shù)
    2022-04-04
  • C語言數(shù)據(jù)結(jié)構(gòu)鏈表隊(duì)列的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)鏈表隊(duì)列的實(shí)現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)鏈表隊(duì)列的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C語言多文件編程問題解析

    C語言多文件編程問題解析

    在某些場景中,考慮到編譯效率和可移植性,#pragma once 和 #ifndef 經(jīng)常被結(jié)合使用來避免頭文件被 重復(fù)引入,這里介紹用 _Pragma 操作符避免頭文件重復(fù)引入的問題,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • C++ 虛函數(shù)及虛函數(shù)表詳解

    C++ 虛函數(shù)及虛函數(shù)表詳解

    這篇文章主要介紹了c++ 虛函數(shù)及虛函數(shù)表詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11

最新評論

闵行区| 当阳市| 封丘县| 大冶市| 安西县| 伊吾县| 南岸区| 呈贡县| 始兴县| 南昌市| 都昌县| 张家川| 合江县| 盐城市| 江都市| 修文县| 涟水县| 东乌珠穆沁旗| 广西| 长白| 台北县| 澄迈县| 苍溪县| 饶河县| 聂拉木县| 德安县| 吐鲁番市| 江孜县| 秭归县| 息烽县| 河津市| 荣成市| 行唐县| 安远县| 大英县| 布尔津县| 怀化市| 龙陵县| 股票| 上虞市| 民权县|