程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 一個字符串中連續出現次數最多的子串【轉】一個字符串中連續出現次數最多的子串【轉】,字符串次數

一個字符串中連續出現次數最多的子串【轉】一個字符串中連續出現次數最多的子串【轉】,字符串次數

編輯:C++入門知識

一個字符串中連續出現次數最多的子串【轉】一個字符串中連續出現次數最多的子串【轉】,字符串次數


 

問題描述:

求一個字符串中連續出現次數最多的子串,子串的長度可以是 1 。

分析問題:

乍一看,好像無處下手。簡單的窮舉效率太低,隨著輸入的文本增長,時間復雜度和空間復雜度就會火箭般竄升至無法接受的地步。
我們需要尋找規律。
假設存在一個長度為 N 的子串 S 出現的次數最多。那麼它具有哪些特點呢?
  • S 的任一子串的出現次數不少於 S 的出現次數
  • S 中不會出現重復的子串字符
  • S 中不會出現重復的字符
  • 組成 S 的每一個字符、每一個子串的出現次數都和 S 一樣
“S 中不會出現重復的字符”,“組成 S 的每一個字符、每一個子串的出現次數都和 S 一樣”! 有了這個結論,問題就簡單了。

算法描述:

找到文本中的出現次數最高的單個字符組成的子串,放入一個隊列中, 從隊列的頭部開始,對結果集中的每一個子串 S 進行處理如此,直至到達隊列尾。

代碼:

#pragma  warning(disable : 4786) #include  < iostream > #include  < string > #include  < deque >
#define  BUFFSIZE 1024
using  std::cout; using  std::endl; using  std:: string ; using  std::deque;
typedef deque < string >  strlist;
const   string ::size_type npos  =   - 1 ; const   string  ignoreChars( " /t/n/r " );
inline bool  IgnoreChar( char  c){      return  (ignoreChars.find(c)  !=  npos); }
/*  * 統計字符出現次數   */ unsigned CharSummary( const   string &  text, unsigned usecount[],  int  tbllen){     unsigned count, i;
    memset(usecount,  0 , tbllen  *   sizeof (unsigned));      for (i  =   0 ;i  <  text.length();usecount[unsigned(text[i ++ ])] ++ );
     for (count  =  i  =   0 ;i  <   256 ;i ++ ){          if (IgnoreChar(i)) continue ;          if (usecount[i]  >  count)count  =  usecount[i];     }
     return  count; }
/*  * 試著增長字符串   */ char  TryGrowthString( const   string &  text,  const   string &  str,  int  maxcount, unsigned *  usecount){      int  count;      string ::size_type pos;      char  c  =   0 ;
    pos  =  text.find(str);      if (pos  ==  npos)          return   0 ;
/*   不是出現次數最多的字符  */     c  =  text[pos  +  str.length()];      if (usecount[unsigned(c)]  <  maxcount)          return   0 ;
/*   檢查文本中的出現次數  */      for (count  =   0 ; pos  +  str.length()  +   1   <  text.length();pos  +=  str.length()){         pos  =  text.find(str, pos);          if (pos  ==  npos)  break ;          if (c  !=  text[pos  +  str.length()])  return   0 ;     }
     return  c; }
void  PrintResult( const  strlist &  result){     strlist::const_iterator citer;
    cout << endl << " The result substrings : " << endl;     cout << " ------------------------------------- " << endl;      for (citer  =  result.begin(); citer  !=  result.end(); citer ++ ){         cout << ' " ' <<* citer << ' " ' << endl;     }     cout << " ------------------------------------- " << endl;     cout << " Total :  " << result.size() << endl; }
void  main( void ){     unsigned usecount[ 256 ];      char  buffer[BUFFSIZE], c;     unsigned count, i;      string  text;     strlist result;
/*  * 從 stdin 讀入文本   */      while ( ! feof(stdin)){          if (fgets(buffer, sizeof (buffer),stdin))             text  +=  buffer;     } /*  * 統計字符出現次數   */     count  =  CharSummary(text, usecount,  sizeof (usecount)  /   sizeof ( * usecount));     cout << " Max count : " << count << endl;
     if ( 0   ==  count){         cout << " There is empty string! " << endl              << " Bye! " << endl;     }
/*  * 將出現次數最多的字符作為子串放入結果中   */      for (i  =   0 ;i  <   sizeof (usecount)  /   sizeof ( * usecount);i ++ ){          if (usecount[i]  ==  count)             result.push_back( string ( 1 , char (i)));     }
/*  * 查找更多的子串   */      for (strlist::iterator iter  =  result.begin();iter  !=  result.end();iter ++ ){         c  =  TryGrowthString(text,  * iter, count, usecount);          if (c)             result.push_back( * iter  +   string ( 1 , c));     }
    PrintResult(result);     cout << " Bye! " << endl; }   測試輸入: abcdefg
bcdef
hijklmnopqrstabcdefg 輸出: Max count :3
The result substrings :
-------------------------------------
"
"
"b"
"c"
"d"
"e"
"f"
"bc"
"cd"
"de"
"ef"
"bcd"
"cde"
"def"
"bcde"
"cdef"
"bcdef"
-------------------------------------
Total : 16
Bye!     轉載地址:http://blog.csdn.net/sayigood/article/details/4413988

一個字符在字符串中連續出現的次數最多的子字符串?算法

public void find(String s){
int i = 0;//字符串下標
int j = 1; //記錄重復數
int max = 1; //記錄最大的重復數
int m = 0; //作為note數組的下標
int note[] = new int[5]; //該數組是記錄輸出最大重復的子字符串的下標
while(i < s.length() - 1){
if(s.charAt(i) == s.charAt(i+1)){
j = j + 1;

}
else{
if(j == max && j != 1){ //該判斷就是為了以防如出現多個最大重復長度的字串,比如aaabbbcc就該有aaa,bbb兩個
m++;
note[m] = i - max +1;
}
if(j > max){
max = j;
note[0] = i - max +1;
for(int n = 1; n < note.length; n++){
note[n] = -1; //出現更大的重復字串則將以前記錄的小標清除
}
}
j = 1;
}
i++;
}
if(max == 1){
System.out.println("所有字符都只單個出現,並無連續");
return;
}
for(int p = 0; p < note.length; p++){
if(note[p] != -1){
System.out.println(s.substring(note[p], note[p]+max));
}
}

}
不明白就請call我啊,呵呵
 

在一個字符串中連續出現次數最多的字符?? 用java 怎實現?

public class SearchChar {

public char search(String str){
int lenght=str.length();
int max=0;
int index=0;
int j;
char ch = str.charAt(0);
for(int i=0;i<lenght;){
index=0;
for(j=i+1;j<lenght;j++){
if(str.charAt(i)==str.charAt(j))
index++;
else
break;
}
if(index>max){
max=index;
ch=str.charAt(i);
}
i=j;
}
return ch;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SearchChar sc=new SearchChar();
char ch=sc.search("ssddfffffffdseeeedsa");
System.out.println(ch);
}

}
 

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