第一题:替换空格
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
string replaceSpace(string s) {
// write code here
string res;
for(auto x:s)
{
if(x == ' ')
res += "%20";
else
res += x;
}
return res;
}
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
string replaceSpace(string s) {
// write code here
string res;
for(int i=0; i<s.size();i++)
{
if(s[i] == ' ')
s.replace(i, 1, "%20"); //从i位置开始的1个字符替换为%20
}
return s;
}
};
第二题:字符串的排列(*)
class Solution {
public:
vector<string> res;
string path;
vector<string> Permutation(string str) {
if(str == "") return res; // [""] []
//全排列
//可能重复字母 靠在一起 好判断
sort(str.begin(),str.end());
path.resize(str.size());
//全排列函数
dfs(str, 0, 0,0);
//字典顺序
sort(res.begin(), res.end());
return res;
}
void dfs(string str, int idx, int start, int state){
if(idx == str.size()){
res.push_back(path);
return;
}
//单个排列没有排完
//相同字母而言 前后关系
//可能重复排序
//通过控制相对顺序不变确保不重复
if(idx == 0 || str[idx] != str[idx - 1]) start = 0;
//顺序往后
for(int i = start; i< str.size();i++){
if(!(state >> i & 1)){
path[i] = str[idx];
dfs(str, idx +1, i+1, state + (1 << i));
}
}
}
};
第三题:第一个只出现一次的字符
class Solution {
public:
int FirstNotRepeatingChar(string str) {
//创建64长度的数字,用于存放字母出现的次数
//A-Z 的ASCII码 65-90
//a-z 的ASCII码 97-122
int res[58];
//初始化数组都为0
for(int i=0;i<58;i++)
res[i]=0;
//出现字母的位置 +1
for(auto x:str)
{
res[int(x)-65] += 1;
}
int j=0,h;
//找出出现一次的位置
for(j=0;j<58;j++)
{
if(res[j]==1)
break;
}
//一次遍历字符,若该字符对应数组位置为1
//则只出现一次,输出下标
if(res[j]==1){
for(h=0;h<str.size();h++)
{
if(res[(int(str[h])-65)]==1){
return h;
break;
}
}
}
else
return -1;
}
};
第四题:左旋转字符串
class Solution {
public:
string LeftRotateString(string str, int n) {
string mov,res;
//保存左移字符
for(int i=0;i<n;i++)
{
mov += str[i];
}
//保存左移右边的字符
for(int i=n;i<str.size();i++)
{
res += str[i];
}
return res += mov;
}
};
class Solution {
public:
string LeftRotateString(string str, int n) {
reverse(str.begin(), str.end());
reverse(str.begin(), str.end()-n);
reverse(str.end()-n, str.end());
return str;
}
};
第五题:翻转单词序列
class Solution {
public:
string ReverseSentence(string str) {
//先整体翻转
reverse(str.begin(),str.end());
//对反转后每个单词进行翻转
for(int i=0,j=0;i<str.size();++i)
{
if(str[i]==' '){
reverse(str.begin()+j,str.begin()+i);
j=i+1;
}
//对最后一个单词进行翻转
if(i==str.size()-1)
{
reverse(str.begin()+j,str.begin()+i+1);
}
}
return str;
}
};
class Solution {
public:
string ReverseSentence(string str) {
//先整体翻转
reverse(str.begin(), str.end());
for(int i=0;i<str.size();i++)
{
int j=i+1;
while(j<str.size() && str[j] != ' ') j++;
reverse(str.begin()+i, str.begin()+j);
i=j;
}
return str;
}
};
第六题:把字符串转换成整数
class Solution {
public:
int StrToInt(string str) {
int k=0;
while(k<str.size() && str[k] == ' ') k++;
long long number = 0;
bool is_minus = false;
if(str[k] == '+') k++;
else if(str[k] == '-') k++, is_minus = true;
while(k<str.size() && str[k] >= '0' && str[k] <= '9'){
number = number * 10 +str[k] - '0';
k++;
}
if(is_minus) number *= -1;
if(k==str.size())
return (int)number;
else
return 0;
}
};
第七题:表示数值的字符串
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return bool布尔型
*/
bool isNumeric(string s) {
// write code here
int i=0, j=s.size();
while(i <= j && s[i] == ' ') i++;
while(i <= j && s[j] == ' ') j--;
if(i >= j) return false;
s = s.substr(i, j - i +1); //去除前后空格
if(s[0] == '+' || s[0] == '-') s = s.substr(1);
if(s.empty() || (s[0] == '.' && s.size() == 1)) return false; //
int dot = 0, e = 0; //分别记录小数点和 e 或 E 出现的次数
for(int i=0; i<s.size() ; i++)
{
if(s[i] >= '0' && s[i] <= '9');
else if(s[i] == '.'){
dot++;
if(dot > 1 || e) return false;
}
else if(s[i] == 'e' || s[i] == 'E'){
e++;
if(!i || i+1 == s.size() || e > 1 || s[i - 1] == '.' && i == 1) return false;
if(s[i + 1] == '+' || s[i+1] == '-'){
if(i + 2 == s.size()) return false;
i++;
}
}
else
return false;
}
return true;
}
};
第八题:正则表达式匹配(*)
class Solution {
public:
/**
状态表示:f[i][j] 表示s[i,......] 和 p[j,......]相匹配
状态转移:
1、p[j] 是正常字符,f[i][j] = s[i] == p[j] && f[i+1][j+1];
2、p[j] 是 '.',f[i][j] = f[i+1][j+1];
3、p[j+1]是'*',f[i][j] = f[i][j+2] || f[i+1][j]
f[n][m] = true;
*/
int n, m;
vector<vector<int>> f;
string s, p;
bool match(string _s, string _p) {
// write code here
s = _s, p = _p;
n = s.size(), m = p.size();
f = vector<vector<int>> (n + 1, vector<int>(m + 1, -1));
return dp(0,0);
}
bool dp(int x, int y){
if(f[x][y] != -1) return f[x][y];
if(y == m)
return f[x][y] = x == n;
bool first_match = x < n && (p[y] == '.' || s[x] == p[y]);
if(y + 1 < m && p[y+1] == '*'){
f[x][y] = dp(x, y + 2) || first_match && dp(x + 1, y);
}
else{
f[x][y] = first_match && dp(x + 1, y + 1);
}
return f[x][y];
}
};