【笔试面试】字符串相关操作

来源:互联网 发布:矩阵的谱范数怎么求 编辑:程序博客网 时间:2024/04/30 16:02

/*2015.08.07*/   //未开始//2015.08.12开始/************字符串相关操作************** 1 字符相关函数的使用,memset,memcpy,memcmp;strcmp,strcpy,strlen** 2 编写string类** 3 字符串公共子串** 4 字符串模式匹配 strstr** 5 两个自字符串的相似度** 6 字符串转换为整数** 7 字符串中第一个不重复的字符** 8 字符串中第一个只出现一次的字符****************************************/#include <string>#include <sstream>#include <vector>using namespace std; //求字符串中第一次只出现一次的字符  ===我的方法只需要遍历一次,还有遍历两次的做法char searchCharFirstOnce(const string & str){int count[256] = {-1};int pos[256]={-1};for (int i=0;i<256;++i){count[i] = 0;pos[i]=-1;}istringstream fin(str);char temp;int k=0;char result;int position = 256;while(fin>>temp)//此处实际有问题:未考虑char为负的情况{++count[temp];if (pos[temp]==-1)pos[temp] = k++;}for (int i=0;i<256;++i){if (count[i]==1 && pos[i] < position){result = i;position = pos[i];}}return result;}//字符串包含问题,主串和模式串bool  stringMatch(const string & str1,const string & str2,int & pos){int i=0,j=0;int len1 = str1.size();int len2 = str2.size();while(i<len1 && j<len2){if (str1[i]==str2[j]){++i;++j;}else{i = i-j+1;j = 0;}}if (j==len2){pos = i-j;return true;}else return false;}//求一个字符串中出现次数最多的字符,及其次数char maxAppearChar(const string & str, int & count){const int dimen = 256;int hashChar[dimen];for (int i=0;i<dimen;++i)hashChar[i] = 0;//法一:for(unsigned i=0;i<str.size();++i)++hashChar[str[i]];//法二:和第一题类似,把字符当做一个流,从中读取数据   略char result = 0;count = hashChar[0];for(int i=1;i<dimen;++i){if (hashChar[i] > count){count = hashChar[i];result = i;}}return result;}//字符交换//要求交换后,小写字母排在前面,大写字母排在后面void exchangeChar(string & str){int i=0;int j= str.size()-1;int len = str.size();while(1){while(i<len && str[i]>='a' && str[i]<='z') ++i;while(j>=0 && str[j]>='A' && str[j]<='Z') --j;if (i<j){char temp = str[i];str[i] = str[j];str[j] = temp;++i;--j;}elsebreak;}}//字符部分排序int partSort(string & str){int i=str.size()-1;int j= str.size()-1;int len = str.size();while(1){while(j>=0 && str[j]!='*') --j;i = j;while(i>=0 && str[i]=='*') --i;swap(str[i--],str[j--]);if(i==-1) break;}return j+1;}//删除字符串中的数字char * deleteDigits(char * str){char * result = str;char * j = str;//while(str)  //此处留意了while(*str!=NULL)  //此处留意了{if (*str>='0' && *str<='9'){str++;}else{*j = *str;j++;str++;}}*j='\0';return result;}//删除特定字符char * removeChar(char * str,char * remove){const int dimen = 256;char * result = str;int hashChar[dimen];for(int i=0;i<dimen;++i)hashChar[i] =0;for (int i=0;remove[i];++i)hashChar[remove[i]]=1;int k=0;for (int i=0;str[i];++i){if (!hashChar[str[i]]){//continue;result[k++] = str[i];}// else// {// result[k++] = str[i];// }}result[k]='\0';return result;}//编写字符串与整数和浮点数互相转换的函数   考点:考察各种特殊情况//字符串转换为整数,考虑正负号bool  str2int(const string & str,int &result){//int flag = true;if (!str.size()){//flag = false;return false;}char temp;int symbol = 1;result =0;istringstream fin(str);fin>>temp;if (temp=='-'){symbol = 0;}else if(temp>='0' && temp<='9'){result = temp-'0';}while(fin>>temp){if (temp>='0' && temp<='9'){result = result*10 + temp-'0';}else{//flag = false;return false;}}if (!symbol){result = 0 - result;}return true;}//整型转换为字符串void int2str(int num,string & str){if (!num){return ;}int2str(num/10,str);str = str+(char)('0'+num%10);}string int2str(int num){string str="";if (!num){str = str+'0';return str;}int symbol =1;if (num < 0){symbol =0;num = -num;str = str+ '-';}int2str(num,str);return str;}//翻转句子中单词的顺序void reverse(string & str,int i,int j){while(i<j)swap(str[i++],str[j--]);}void reverseStr(string & str){int i=0,j=0;int len = str.size();while(j<len){while(i<len && str[i]==' ') ++i;j = i;while(j<len && str[j]!=' ') ++j;//左开右闭区间reverse(str,i,j-1);i = j;}reverse(str,0,len-1);}//求两个字符串的最长公共子串 DP解法  //特点:子串连续int maxLengthSubString(string & str1,string & str2){int len1 = str1.size();int len2 = str2.size();vector<vector<int>> subNum;subNum.resize(len1+1);for (int i=0;i<len1+1;++i)subNum[i].resize(len2+1);for (int i=0;i<len1+1;++i)subNum[i][0]=0;for (int i=0;i<len2+1;++i)subNum[0][i]=0;for(int i=1;i<len1+1;++i){for (int j=1;j<len2+1;++j){if (str1[i-1] == str2[j-1]){subNum[i][j] = subNum[i-1][j-1]+1;}else subNum[i][j] = 0;}}//ceshi// for (int i=0;i<len1+1;++i)// {// for (int j=0;j<len2+1;++j)// {// cout<<subNum[i][j]<<" ";// }// cout<<endl;// }int maxN =0;int end = 0;for (int i=1;i<len1+1;++i){for(int j=1;j<len2+1;++j){if (subNum[i][j] > maxN){maxN = subNum[i][j];end = j;}}}cout<<str1<<"和"<<str2<<"的最长公共子串是:"<<ends;for (int i=end-maxN;i<end;++i){cout<<str2[i];}cout<<endl;return maxN;}//找出字符串的最长子串,要求子串所有字符相同string maxContinueSubStr(const string &str){//char result;int pos =0;int count=1;int maxK=0;for (unsigned i=1;i<str.size();++i){if (str[i]==str[i-1]){count++;if (count>maxK){maxK = count;pos = i;}}elsecount =1;}cout<<"最长连续相同字符的子串长度为"<<maxK<<",子串为";string str1="";while(maxK--){str1 = str1 + str[pos];}cout<<str1<<endl;return str1;}//删除字符串中重复的字符---保留第一次出现的char * deleteRepeatChar(char * str){char * temp = str;const int demen = 256;int hashChar[demen];for (int i=0;i<demen;++i)hashChar[i] =0;char * result = str;while(*str!=NULL){if (!hashChar[*str]){hashChar[*str] = 1;*result++ = *str++;}elsestr++;}*result  = '\0';return temp;}//输出一个字符串的字符的全部排列//回溯一把bool isValidChr(const string & str,vector<char> & strchr,int pos){for(unsigned i=0;i<str.size();++i){if (strchr[i]==str[pos]){return false;}}return true;}void backTraking(const string & str,vector<char> & strChr,int pos,int & count){if (pos == str.size()){for (unsigned i=0;i<strChr.size();++i){cout<<strChr[i]<<" ";  }cout<<endl;count ++;strChr[pos-1] = '*';return;}for (unsigned i=0;i<str.size();++i){if (isValidChr(str,strChr,i)){strChr[pos] = str[i];//break;backTraking(str,strChr,pos+1,count);}}if (strChr[pos]=='*'){if (pos==0){return;}strChr[pos-1] = '*';}}void backTraking(const string & str){vector<char> strChr;strChr.resize(str.size());for (unsigned i=0;i<strChr.size();++i){strChr[i] = '*';}int len = str.size();int count =0;backTraking(str,strChr,0,count);}//求字符串的最长重复子串//求字符串的最长的没有重复字符的子串//求字符串中连续出现字数最多的子串//求包含字符集合的最短的子串



0 0
原创粉丝点击