1,Vaild Palindrome

 bool isPalindrome(string& s) {
transform(s.begin(), s.end(), s.begin(), tolower); // 把字符全部转换成小写
int left = ;
int right = s.length()-;
while (left < right) {
if (!isalnum(s[left])) ++left;
else if (!isalnum(s[right])) --right;
else if (s[left] != s[right]) return false;
else {
++left;
--right;
}
}
return true;
}

isPalindrome

2,Implement strStr

 int strStr(const string& haystack, const string& needle) { // KMP 算法,BM 算法
if (needle.empty()) return ;
const int N = haystack.length() - needle.length();
for (int i = ; i <= N; ++i) {
int j = i; // 源串索引
int k = ; // 字串索引
while (haystack[j] == needle[k] && j < haystack.length() && k < needle.length()) {
++j;
++k;
}
if (k == needle.length()) return i;
}
return -;
}

strStr

3,String to Integer(atoi)

 int myAtoi(const string& str) {
const int n = str.length();
int sign = ;
int i = ;
int num = ; while (str[i] == ' ' && i < n) ++i; // 前面的字符处理
if (str[i] == '+') {
sign = ;
++i;
}
else if (str[i] == '-') {
sign = -;
++i;
}
for (; i < n; ++i) {
if (str[i] < '' || str[i] > '')
break;
num = num * + str[i] - ''; if (sign == && num > INT_MAX)
return INT_MAX;
else if (sign == - && num > INT_MIN + )
return INT_MIN;
}
return sign * num;
}

myAtoi

4,Add Binary

 string addBinary(string a, string b) {  // 思路同 Add Binary(链表类型题) plusOne(数组类型题)
string result;
int carry = ;
reverse(a.begin(), a.end()); // 先反转两个数组,从低位开始相加
reverse(b.begin(), b.end());
const int n = a.length() > b.length() ? a.length() : b.length();
for (int i = ; i < n; ++i) {
const int ai = i < a.length() ? a[i]-'' : ;
const int bi = i < b.length() ? b[i]-'' : ;
int value = (ai + bi + carry) % ;
carry = (ai + bi + carry) / ;
result.insert(result.begin(), value + '');
}
if (carry == )
result.insert(result.begin(), '');
return result;
}

addBinary

5,Longest Palindromic Substring(未实现)

6,Regular Expression Matching

 bool isMatchI(const char *s, const char *p) {   //递归版   有挑战的一道题目
if (*p == '\0') return *s == '\0'; //next char is not '*',then match current character
if (*(p + ) != '*') {
if (*p == *s || (*p == '.' && *s != '\0')) { // correctly match
return isMatchI(s + , p + );
}
else { // failed match
return false;
}
}
else { // next char is '*'
while (*p == *s || (*p == '.' && *s != '\0')) {
if (isMatchI(s, p + )) {
return true;
}
s++;
}
return isMatchI(s, p + );
}
}

isMatch

7,Wildcard Matching

 bool isMatchII1(const char *s, const char *p) {  // 递归版
if (*p == '*') {
while (*p == '*') ++p; // skip continuous '*'
if (*p == '\0') return true;
while (*s != '\0' && !isMatchII1(s, p)) ++s; return *s != '\0';
}
else if (*p == '\0' || *s == '\0')
return *p == *s;
else if (*p == *s || *p == '?')
return isMatchII1(++s, ++p);
else
return false;
}
bool isMatchII2(const char *s, const char *p) { // 迭代版
bool star = false;
const char *str = s; // str 可以变,*str 不能变
const char *ptr = p; while (*str != '\0') {
switch (*ptr) {
case '?':
str++;
ptr++;
break;
case '*':
star = true;
while (*ptr == '*') ++p;
if (*ptr == '\0') return true;
break;
default:
if (*str != *ptr) {
if (!star)
return false;
str++;
}
}
}
while (*ptr == '*') ++ptr;
return (*ptr == '\0'); }

isMatch

8,Longest Common Prefix

 string longestCommonPrefix1(vector<string>& strs) {  // 纵向扫描
if (strs.empty()) return ""; for (int index = ; index < strs[].size(); ++index) { // 选取第一个字符串和其它字符串进行比较
for (int i = ; i < strs.size(); ++i) {
if (strs[i][index] != strs[][index])
return strs[].substr(, index);
}
}
return strs[];
} string longestCommonPrefix2(vector<string>& strs) { // 横向扫描
if (strs.empty()) return ""; int right_most = strs[].size() - ;
for (size_t i = ; i < strs.size(); ++i) {
for (int j = ; j <= right_most; ++j) {
if (strs[i][j] != strs[][j])
right_most = j - ;
}
}
return strs[].substr(, right_most + );
}

longestCommonPrefix

9,Valid Number

 bool isNumber(const char *s) {  //
char* endptr;
strtod(s, &endptr); if (endptr == s)
return false; for (; *endptr; ++endptr) {
if (!isspace(*endptr))
return false;
}
return true;
}

isNumber

10,Integet to Roman

 string intToRoman1(int num) {
const int radix[] = { , , , , , , , , , , , , };
const string symbol[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; string roman;
for (size_t i = ; num > ; ++i) {
int count = num / radix[i];
num %= radix[i];
for (; count > ; --count)
roman += symbol[i];
}
return roman;
} string intToRoman2(int num) {
string res = "";
vector<int> val = { , , , , , , , , , , , , };
vector<string> str = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
for (int i = ; i < val.size(); ++i) {
while (num >= val[i]) {
num -= val[i];
res += str[i];
}
}
return res;
}

intToRoman

11,Roman to Integer

 int romanToInt(const string& s) {
int result = ;
unordered_map<char, int> mapping;
mapping['I'] = ;
mapping['V'] = ;
mapping['X'] = ;
mapping['L'] = ;
mapping['C'] = ;
mapping['D'] = ;
mapping['M'] = ; for (size_t i = ; i < s.size(); i++) {
if (i > && (mapping[i] > mapping[i - ])) {
result += (mapping[s[i]] - * mapping[s[i - ]]);
}
else {
result += mapping[s[i]];
}
}
return result;
}

romanToInt

12,Count and Say

 string getNext(const string& s) {
stringstream ss;
for (auto i = s.begin(); i != s.end();) {
auto j = find_if(i, s.end(), bind1st(not_equal_to<char>(), *i)); // 需要看看函数怎么用
ss << distance(i, j) << *i;
i = j;
}
return ss.str();
} string countAndSay(int n) {
string s("");
while (--n) {
s = getNext(s);
}
return s;
}

countAndSay

13,Anagrams(回文构词法)

 vector<string> anagrams(vector<string>& strs) {
unordered_map<string, vector<string>> group;
for ( auto s = strs.begin(); s != strs.end();++s) {
string key = *s;
sort(key.begin(), key.end()); // 会修改原数据
group[key].push_back(*s);
}
vector<string> result;
for (auto it = group.cbegin(); it != group.cend(); ++it) {
if (it->second.size() > )
result.insert(result.end(), it->second.begin(), it->second.end());
}
return result;
}

anagrams

14,Simplify Path

 string simplifyPath(const string& path) {
string dir;
stack<string> stk;
string result; for (auto i = path.begin(); i != path.end();) {
++i;
auto j = find(i, path.end(), '/');
dir = string(i, j); /* 获取两个 / / 之间的内容 */ if (!dir.empty() && dir !="/" && dir != ".") {
if (dir == "..") {
if (!stk.empty())
stk.pop();
}
else
stk.push(dir);
}
i = j;
}
//stringstream out; // 可以用字符串流保存,然后通过 out.str() 转化成字符串返回
if (stk.empty())
//out << "/";
result = "/";
else {
while (!stk.empty()) {
string s = stk.top();
stk.pop();
//out << '/' << s;
result += "/" + s;
}
}
// return out.str();
return result;
}

simplifyPath

15,Length of Last Word

 int lengthOfLastWord1(const string& s) {  // STL::find_if,find_if_not,distance
auto first = find_if(s.rbegin(), s.rend(), isalpha);
auto last = find_if_not(first, s.rend(), isalpha);
return distance(first, last);
} int lengthOfLastWord2(const string& s) {
int len = ;
for (int i = ; i < s.length(); ++i) {
if (s[i] != ' ')
++len;
else
len = ;
}
return len;
}

lengthOfLastWord

c++常用函数

1, split

#include<vector>
#include<iostream>
#include<algorithm>
#include<cstring> using namespace std; vector<string> split(string str, const char* c) {
char *cstr, *p;
vector<string> res;
cstr = new char[str.length()+];
strcpy(cstr, str.c_str());
p = strtok(cstr, c); while(p != NULL) {
res.push_back(p);
p = strtok(NULL, c);
}
delete cstr; // 释放内存
return res;
} int main() {
string s = "a AND B";
const char *c = " ";
vector<string> ans;
ans = split(s, c); for(int i=;i<ans.size();i++) {
cout << ans[i] << endl;
}
return ;
}

split

以上题目来源于:http://www.github.com/soulmachine/leetcode

leetcode 字符串类型题的更多相关文章

  1. leetcode 链表类型题总结

    链表测试框架示例: // leetcodeList.cpp : 定义控制台应用程序的入口点.vs2013 测试通过 // #include "stdafx.h" #include ...

  2. leetcode 动态规划类型题

    1,Triangle int mininumTotal(vector<vector<int>>& triangle) { ; i >= ; --i) { ; j ...

  3. leetcode 树类型题

    树的测试框架: // leetcodeTree.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  4. leetcode 数组类型题总结

    1,removeDuplicates(I) int removeDuplicatesI(vector<int>& nums){ // 重新组织数组,同 removeDuplicat ...

  5. leetcode 数组类型题

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h& ...

  6. 【python】Leetcode每日一题-扰乱字符串

    [python]Leetcode每日一题-扰乱字符串 [题目描述] 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行 ...

  7. LeetCode 第 3 题(Longest Substring Without Repeating Characters)

    LeetCode 第 3 题(Longest Substring Without Repeating Characters) Given a string, find the length of th ...

  8. 【leetcode 字符串处理】Compare Version Numbers

    [leetcode 字符串处理]Compare Version Numbers @author:wepon @blog:http://blog.csdn.net/u012162613 1.题目 Com ...

  9. leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

随机推荐

  1. Oracle数据库基础教程

    Oracle基础 简介 数据库实例 表空间 登录身份和角色 用户和授权 数据类型 数据操作 导入数据库 一.Oracle基础: 1.简介 Oracle创建数据库不能像SQL Server那样用一个简单 ...

  2. hadoop distcp 命令& 不同hadoop 版本cp

    # 1 版本相同 hadoop distcp -m 10 -bandwidth 150 hdfs://ns1/user/hive/warehouse/public.db/public_oi_fact ...

  3. beego orm 时间相差八小时

    使用beego框架,前端调用api插入一条数据到mysql,时间差了8个小时,fuck!!! 解决办法: 在db的url后面加上时区- dbDataSource = root:test@tcp(192 ...

  4. C++11之for循环的新用法《转》

    相关资料:https://legacy.gitbook.com/book/changkun/cpp1x-tutorial/details C++11之for循环的新用法 C++使用如下方法遍历一个容器 ...

  5. Django--URL(路由层)

    一.django 静态文件配置 在配置文件中settings.py STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR ...

  6. mui init 出现无法引入子页面问题

    1. 检查项目中是否重复出现了 mui.init() 函数; mui.init({ subpages: [{ styles: { // top: "44px", top: &quo ...

  7. 构造函数,C++内存管理,内存泄漏定位

    构造函数 1.构造顺序 虚基类构造函数,基类构造函数,类对象构造函数,自己的构造函数 2.必须使用初始化列表 (1) 引用成员,常量成员: (2) 基类没默认构造函数(自己重载覆盖了), (3)类对象 ...

  8. java解决查找问题

    1.给定一个字符串,找到里面的大写字母和小写字母以及其他字母的个数: 代码: package test; public class Stringclass { public static void m ...

  9. Python unindent dese not match any out indentation level 问题

    今天写个小程序出现 “unindent dese not  match any out indentation level”. 一直没找到原因,经过仔细对比发现实际上是缩进的问题. 上下两行的缩进用的 ...

  10. Maven项目之间的关系

    1. 依赖关系 1.1 标签<dependency>把另一个项目的jar引入到当前项目 1.2 自动下载另一个项目所依赖的其他项目 2. 继承关系. 2.1 父项目是pom类型 2.2 子 ...