程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 應用C說話提取子字符串及斷定對稱子字符串最年夜長度

應用C說話提取子字符串及斷定對稱子字符串最年夜長度

編輯:關於C++

應用C說話提取子字符串及斷定對稱子字符串最年夜長度。本站提示廣大學習愛好者:(應用C說話提取子字符串及斷定對稱子字符串最年夜長度)文章只能為提供參考,不一定能成為您想要的結果。以下是應用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
    ****************************************************************/ 


斷定回文子串
斷定子串能否為回文,可以斟酌從外向外比擬。例如字符串“谷歌”,假如我們斷定第二個字符o是對稱的,只須要再向左、和向右各移一名便可以斷定下一個字符串能否是對稱的了
須要留意的一點是,針對原字符串中的每個字符有兩種情形:

    以該字符為中間的對稱散布,也就是回文子串為奇數
    以該字符和該字符前一個字符為中間的對稱散布,也就是說回文子串是偶數


時光龐雜度剖析:

外層須要n - 1層輪回,內層關於每一個字符,都由中央向雙方遍歷一遍,為n,是以總的時光龐雜度為O(n * n)

標題

    標題描寫: 
    輸出一個字符串,輸入該字符串中對稱的子字符串的最年夜長度。 
    好比輸出字符串“谷歌”,因為該字符串裡最長的對稱子字符串是“goog”,是以輸入4。 
    輸出: 
    存在多組數據,每組數據一行字符串,長度不年夜於100。 
    輸入: 
    輸入回文子串的最年夜長度。 
    樣例輸出: 
    谷歌 
    樣例輸入: 
    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
    ****************************************************************/ 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved