最长数字子串——学习总结

1.遍历字符串中的每一个字符时,判断当前字符的状态,并且根据前一个字符的值,进行判断。这是基本的架构和方法。

2.特别需要注意的是最后一个字符的处理。应当将其单独列出来进行判断和比较。

例如:求出字符创中的最长连续数字子串:

1.首先判断当前字符是否为数字;如果是,判断前一个字符是否为数字,根据前一个字符是否是数字进行分别处理。在这里面需要特别注意到的是,如果遍历过程即将结束,最后一个字符是数字时,应该单独将其提取出来进行判断处理。

if(inputstr[i]>='0'&&inputstr[i]<='9')

       {

          if(begin == false)

          {

             tempStart = i;

             begin = true;

             count++;

          }

          else

          {

              tempEnd = i;

              count++;

          }

      if((inputstr[i+1] == '\0')&&(count>maxLen))

      {

              maxLen = count;

              start = tempStart;

              end = tempEnd;

      }

 }

2.如果当前字符不是数字字符,那么根据前一个字符是否为数字进行处理。

else

       {

           if((begin == true)&&(count>maxLen))

           {

              maxLen = count;

              start = tempStart;

              end = tempEnd;

           }

           begin = false;

           count = 0;

       }


整个程序的代码如下:

#include <iostream>

#include <cstdlib>

using namespace std;

 

//查找字符串中连续最长的数字串

int continuemax(char *outputstr, char *inputstr)

{

 //最大连续数字串的长度

   int maxLen = 0;

 //最大连续数字串的起始位置

   int start = 0;

 //最大连续数字串的结束位置

   int end = 0;

 //临时记录每一次遍历时,新的数字子串的起始位置的参数

   int tempStart = 0;

 //临时字符指针,指向outputstr的起始位置

   char *temp = outputstr;

   //临时记录每一次遍历时,新的数字子串的起始位置的参数

 int tempEnd = 0;

 //标记值,标记前一个字符是否为数字,这个标记值,对于连续子串的判断非常有帮助

   bool flag = false;

   //数字子串的计数器

   int count = 0;

 //开始遍历字符串

   for(int i=0;inputstr[i];i++)

   {

   //判断当前字符是否为数字

       if(inputstr[i]>='0'&&inputstr[i]<='9')

       {

     //如果前一个字符不是数字

          if(flag == false)

          {

             tempStart = i;

             flag = true;

             count++;

          }

      //如果前一个字符是数字

          else

          {

              tempEnd = i;

              count++;

          }

      //如果此字符是最后一个数字了,这时候需要单独提取出来进行判断

      if((inputstr[i+1] == '\0')&&(count>maxLen))

      {

        maxLen = count;

              start = tempStart;

              end = tempEnd;

      }

       }

   //如果当前字符不是数字

       else

       {

     //判断前一个字符是否为数字,如果是数字的话需要进行判断,其数字子串跟前一个比是否更长

           if((flag == true)&&(count>maxLen))

           {

              maxLen = count;

              start = tempStart;

              end = tempEnd;

           }

     //判断完后,因为这个字符不是数字,所以将其标记值标记为false;

           flag = false;

           count = 0;

       }

   }

   for(int i = start;i <= end;i++)

   {

       *temp = inputstr[i];

       temp++;

   }

   *temp = '\0';

   return maxLen;

}

 

 

int main(int argc, char* argv[])

{

   char inputstr[] = "abcd12345ed125ss123456789";

   char *outputstr = new char[strlen(inputstr) + 1];

   memset(outputstr, 0, strlen(inputstr) + 1);

   cout<<continuemax(outputstr, inputstr)<<"  "<<outputstr<<endl;

   delete [] outputstr;

   system("PAUSE");

   return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值