一、编程实现字符串中各单词的反转
这种题目的思路通常就是先将每个单词中的字母倒置,然后再将整个字符串倒置。
#include <iostream>
using namespace std;
void change(char *str);
int main(int argc, char **argv)
{
char src[] = "I am from Shanghai";
cout << src << endl;
change(src);
cout << src << endl;
return 0;
}
void change(char *src)
{
char *start = src, *end = src, *ptr = src;
while(*ptr++ != '\0') //遍历整个字符串
{
if(*ptr == ' ' || *ptr == '\0') //找到一个单词
{
end = ptr - 1; //end指向单词的末尾
while (start < end)
{
swap(*start, *end); //使用库函数将单词倒置
start++;
end--;
}
start = end = ptr + 1; //指向下一个单词的开头
}
}
start = src, end = ptr - 2; //start指向字符串的起始位置, end指向字符串的末尾
while(start < end)
{
swap(*start++, *end--); //将整个字符串倒置
}
}
二、编程判断字符串是不是回文
#include <iostream>
#include <cstring>
using namespace std;
int func(char *str);
int main(int argc, char **argv)
{
int ret;
char str[10] = "level";
char str2[10] = "12345";
ret = func(str);
if(ret == 1)
cout << str << "是回文" << endl;
else if(ret == 0)
cout << str << "不是回文" << endl;
else
cout << "此字符串无效" << endl;
return 0;
}
int func(char *str)
{
int flag = 1; //0不是回文,1表示回文
if(str == NULL)
return -1; //-1表示这个字符串无效
int len = strlen(str); //计算字符串的长度
int i = 0;
for(; i < (len /2); i++)
{
if(*(str + i) != *(str + len - i -1))
{
flag = 0;
break;
}
}
return flag;
}
我们只要比较一个字符串前面和后面对应位置的字符是不是相同,如果都相同,那么这个字符串就是回文,否则只要有一个对应的位置的字符不同,那么这个字符串就不是回文。
三、编程实现字符串比较
这道题就是让我们实现库函数中的strcmp函数。
#include <iostream>
#include <cstring>
using namespace std;
int mystrcmp(const char *str1, const char *str2);
int main(int argc, char **argv)
{
char str[10] = "hallo";
char str1[10] = "hallo";
char str2[10] = "hall";
char str3[10] = "hallob";
cout << mystrcmp(str, str1) << endl;
cout << mystrcmp(str, str2) << endl;
cout << mystrcmp(str, str3) << endl;
return 0;
}
int mystrcmp(const char* str1, const char *str2)
{
int flag = 0; //0表示相同,1表示str1 > str2, -1 表示str1< str2;
int len1 = strlen(str1);
int len2 = strlen(str2);
int len;
if(len1 > len2)
len = len1;
else
len = len2;
int i;
for(i = 0; i < len; i++)
{
if(*str1 < *str2) //只要有一个字符不同就将flag置为相应的值并且退出
{
flag = -1;
break;
}
else if(*str1 > *str2) //只要有一个字符就将flag置为相应的值并且退出
{
flag = 1;
break;
}
str1++;
str2++;
}
return flag;
}
四、编程查找两个字符串的最大公共子串
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
char *commonstring(char *str1, char *str2)
{
int i, j;
char *shortstr, *longstr;
char *substr;
if(NULL == str1 || NULL == str2) //判断这两个字符串的有效性
return NULL;
if(strlen(str1) <= strlen(str2)) //将长的字符串赋值给longstr,短的字符串赋值给shortstr
{
shortstr = str1;
longstr = str2;
}
else
{
shortstr = str2;
longstr = str1;
}
if(strstr(longstr, shortstr) != NULL) //利用库函数在longstr中寻找短串shortstr,
//如果找到了最大公共子串就是shortstr
return shortstr;
substr = new char[strlen(shortstr) + 1]; //给substr动态分配一个可以容纳shortstr的空间
for(i = strlen(shortstr)-1; i > 0; i--)
{
for(j = 0; j <= strlen(shortstr) - i; j++)
{
memcpy(substr, &shortstr[j], i); //将短字符的一部分复制到substr中,
//然后和长串比较,看看长串中是否包含substr
substr[i] = '\0';
if(strstr(longstr, substr) != NULL)
return substr;
}
}
return NULL;
}
int main(int argc, char **argv)
{
char *str1 = new char[256];
char *str2 = new char[256];
char *common = NULL;
cin.getline(str1, 256);
cin.getline(str2, 256);
common = commonstring(str2, str1);
cout << common << endl;
return 0;
}
【注意】:因为是找最大的公共子串,所以应该先看看,短串是不是长串的公共子串,如果是,就直接返回这个端串。如果不是,那么我们就要先从短串中开始遍历,看看短串的一部分是不是长串的子串,注意,这里我们也是从短串中取出最长的一部分赋值给substr,判断是不是长串的子串,然后依次减小substr的长度,进行比较。