Implement strStr()
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
class Solution {
public:
char *strStr(char *haystack, char *needle) {
char *s,*t;
int i=0,j=strlen(haystack)-strlen(needle);
while(i++<=j)
{
s=haystack;
t=needle;
while((*s==*t)&&*s&&*t)
{
t++;s++;
}
if(*t=='\0')return haystack;
haystack++;
}
return NULL;
}
};
数字与字符串
Integer to Roman
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
class Solution {
public:
int a[7]={1,5,10,50,100,500,1000};
char *s="IVXLCDM";
string intToRoman(int num)
{
string x="";
for(int i=6;i>=0;i--)
{
if(i%2==0)
{
int n=num/a[i];
if(n==4)
{
x=x+s[i]+s[i+1];
num-=a[i]*4;
}
else while(n-->0)
{
x+=s[i];
num-=a[i];
}
}
else
{
int m=num-a[i];
if(m>=0)
{
int remain=m/a[i-1];
if(remain<4)
{
x=x+s[i];
num=num-a[i];
}
else
{
x=x+s[i-1]+s[i+1];
num=num-9*a[i-1];
}
}
}
}
return x;
}
};
Interleaving String
用递归的方法,导致大集合超时
class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
if(s3.size()!=s1.size()+s2.size())return false;
if(s1.size()==0)
{
if(s3==s2)
return true;
return false;
}
if(s2.size()==0)
{
if(s3==s1)
return true;
return false;
}
if(s3[0]==s1[0]&&s3[0]!=s2[0])return isInterleave(s1.substr(1),s2,s3.substr(1));
if(s3[0]==s2[0]&&s3[0]!=s1[0])return isInterleave(s1,s2.substr(1),s3.substr(1));
if(s3[0]==s1[0]&&s3[0]==s2[0])return isInterleave(s1.substr(1),s2,s3.substr(1))
||isInterleave(s1,s2.substr(1),s3.substr(1));
return false;
}
};
用二维动态规划
二维数组v[i][j]的值表示能否用s1前i个字符和s2前j个字符组成s3前i+j个字符。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
if(s3.size()!=s1.size()+s2.size())return false;
vector<vector<bool>> v(s1.size()+1,vector<bool>(s2.size()+1,false));
v[0][0]=true;
for(int i=1;i<s1.size()+1;i++)
{
if(s1[i-1]==s3[i-1])
{ v[i][0]=true;}
else
break;
}
for(int i=1;i<s2.size()+1;i++)
{
if(s2[i-1]==s3[i-1])
{ v[0][i]=true;}
else
break;
}
for(int i=1;i<s1.size()+1;i++)
{
for(int j=1;j<s2.size()+1;j++)
{
if(v[i-1][j]&& s3[i+j-1]==s1[i-1])
{
v[i][j]=true;
}
else if(v[i][j-1]&& s3[i+j-1]==s2[j-1])
{
v[i][j]=true;
}
else
{
v[i][j]=false;
}
}
}
return v[s1.size()][s2.size()];
}
};