给定两个字符串s和t,它们只包含小写字母。字符串t有字符串s随机重排,然后在随机位置添加一个字母,请找出在t中被添加的字母。
示例一:
输入:s="abcd",t="abcde"
输出:"e"
示例二:
输入:s="",t="y"
输出:"y"
方法一:计数
首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符。
char findTheDifference(char * s, char * t){
int a[26]={0};
int m=strlen (s);
int n=strlen (t);
for (int i=0;i<m;i++)
{
a[s[i]-'a']++;
}
for (int i=0;i<n;i++)
{
a[t[i]-'a']--;
if (a[t[i]-'a']<0)
{
return t[i];
}
}
return ' ';
}
时间复杂度:O(n)
空间复杂度:O(n)
方法二:求和
将字符串s中的ASCII码求和得到As;对字符串t中的ASCII码求和At。两者的差值At-As即代表了被添加的字符
char findTheDifference(char * s, char * t){
int as=0;
int at=0;
int n=strlen (s);
int m=strlen (t);
for (int i=0;i<n;i++)
{
as+=s[i];
}
for (int i=0;i<m;i++)
{
at+=t[i];
}
return at-as;
}
时间复杂度:O(n)
空间复杂度:O(1)
方法三:位运算
如果两个字符串拼接成一个字符串,则问题转换成字符串中出现奇数次的字符。
char findTheDifference(char * s, char * t){
int res=0;
int n=strlen (s);
int m=strlen (t);
for (int i=0;i<n;i++)
{
res^=s[i];
}
for (int i=0;i<m;i++)
{
res^=t[i];
}
return res;
}
时间复杂度:O(n)
空间复杂度:O(1)