1、标准库函数
int strlen(char* s) {
if(s==NULL) return 0;
int len=0;
while(str[++len]!='\0');
return len;
}
char strcpy(char* str1,const char* str2) {
if(str1==str2) return str1;
assert((str1!=NULL) && (str2!=NULL));
char *addr=str1;
while(*str1++=*str2++);
return addr;
}
//if str1 == str2 return 0;
//else if str1 < str2 return negative number
//else return positive number
int strcmp(const char *str1,const char* str2) {
while(*str1++ == *str2) {
if(*str2++ == 0) return 0;
}
return (*--str1 - *str2);
}
2、逆转字符串其改进常应用在判断是否回文数、大数的运算等。
void reverse_str(char *str,int beg,int ed) {
int i,j;
for(i=beg,j=ed-1;i<j;i++,j--) {
swap(str[i],str[j]);
}
}
3、左旋字符串
左旋的定义:将前面k个字符放到字符串的末尾,比如 'abcdef'左旋两位变为'cdefab'.
如下变换即可,易证时间复杂度为O(n)
abcdef -> ba | cdef -> ba | fedc -> cdefab
int strlen(char* s) {
if(s==NULL) return 0;
int len=0;
while(str[++len]!='\0');
return len;
}
char strcpy(char* str1,const char* str2) {
if(str1==str2) return str1;
assert((str1!=NULL) && (str2!=NULL));
char *addr=str1;
while(*str1++=*str2++);
return addr;
}
//if str1 == str2 return 0;
//else if str1 < str2 return negative number
//else return positive number
int strcmp(const char *str1,const char* str2) {
while(*str1++ == *str2) {
if(*str2++ == 0) return 0;
}
return (*--str1 - *str2);
}
void reverse_str(char *str,int beg,int ed) {
int i,j;
for(i=beg,j=ed-1;i<j;i++,j--) {
swap(str[i],str[j]);
}
}
void left_rotate(char *str,int k,int n) {
reverse_str(str,0,k);
reverse_str(str,k,n);
reverse_str(str,0,n);
}
4.输出字符串的所有排列
void permutation(char *str,int beg,int ed) {
int i;
if(beg==ed-1) {
for(i=0;i<ed;i++)
cout<<str[i]<<" ";
cout<<endl;
}
for(i=beg;i<ed;i++) {
swap(str[beg],str[i]);
permutation(str,beg+1,ed);
swap(str[beg],str[i]);
}
}
void left_rotate(char *str,int k,int n) {
reverse_str(str,0,k);
reverse_str(str,k,n);
reverse_str(str,0,n);
}
void permutation(char *str,int beg,int ed) {
int i;
if(beg==ed-1) {
for(i=0;i<ed;i++)
cout<<str[i]<<" ";
cout<<endl;
}
for(i=beg;i<ed;i++) {
swap(str[beg],str[i]);
permutation(str,beg+1,ed);
swap(str[beg],str[i]);
}
}