- 数字转字符串
- 字符串逆置(char*、string、折半法逆置字符串、异或法逆置字符串)
- 字符串逆置保持单词不变
- 实现strcpy,strcat,strcmp,strstr
- 最长公共子串(这个博客里讲的比较好,这里我只是自己实现了一下,子串我的博客里已经讲过了 http://blog.sina.com.cn/s/blog_54f82cc20100zi4b.html)
- 最长公共子序列(和子串很像,只是状态转移公式不太一样:字符相等arr[i][j]=arr[i-1][j-1]+1;/字符不等arr[i][j]=max(arr[i][j-1],arr[i-1][j]);然后返回arr[len1][len2]就是最长公共子序列的长度;)
- 回文串(和逆置后的字符串是否相等,leetcode有道很难的最短回文串的题目,是加最少的字符使其成为回文串214. Shortest Palindrome博客里有总结,是利用了KMP里的next数组)
- 字符串最后一个单词的长度(华为OJ上的题热门第一- -|||,cin以空格为结束,所以用getline读取字符串,然后从最后找到空格,length减去找到空格的下标减一即可,当然我是用循环做的,为什么都是90分!!怒)
- 大数加法(字符串加法)
- 大数乘法(字符串减法)
#include<iostream> #include<string> #include<assert.h> #include <vector> #include <algorithm> using namespace std; //数字转字符串 string InttoChar(int num) { if (num == 0) return "0"; string res; while (num != 0) { int tmp = num % 10; char ctmp = tmp + '0'; res.push_back(ctmp); num /= 10; } reverse(res.begin(), res.end()); return res; } //字符串逆置 string reversestring(string s1) { if (s1 == "") return s1; string s2 = ""; for (int i = s1.length() - 1; i >= 0; i--) { s2 += s1[i]; } return s2; } //折半法逆置字符串 char* revetsestring(char* s1) { if (s1 == NULL) return s1; int len = strlen(s1); char* p1, *p2; p1 = s1, p2 = s1 + len - 1; char tmp; while (p1 != p2) { tmp = *p1; *p1 = *p2; *p2 = tmp; p1++; p2--; } return s1; } //异或法逆置字符串 char* revetsestr(char* str) { if (str == NULL) return str; char* f = str, *b = str + strlen(str) - 1; while (f<b) { *f ^= *b; *b ^= *f; *f ^= *b; f++; b--; } return str; } //字符串逆置单词内部顺序不变 char* ReverseWords(char* s1) { int len = strlen(s1); if (s1 == NULL || len == 1) return s1; int i = len - 1, j = len; //ij记录单词的位置 int t = 0; //暂存已经录入单词的位置 char* res = new char[len + 1]; //len不包含' '要申请len+1个 int k = 0; //新字符串的位置 while (i>0) { while (s1[i] != ' '&&i != 0) i--; t = i; if (i != 0) { i++; while (i<j) { res[k++] = s1[i++]; } res[k++] = ' '; j = t; i = t - 1; } else { while (i<j) { res[k++] = s1[i++]; } i = t; } } res[len] = '