给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
示例1:
输入:ransomNote = "a", magazine = "b"
输出:false
示例2:
输入:ransomNote = "aa", magazine = "ab"
输出:false
示例3:
输入:ransomNote = "aa", magazine = "aab"
输出:true
整体思路:
这算是比较简单的一个题。我的代码时间和空间复杂度都不太占优势,但我感觉容易理解。magzine字符串应该是比ransom字符串长或者相等,那么我们while循环,同时每一轮从0开始遍历magzine,遇到与ransom中相等的字符则将magzine中的字符设为‘0’,最后统计0的数量是否与ransom字符串的数量相等,相等返回true。
代码题解:
class Solution {
public:
bool canConstruct(string r, string ma) {
int m=r.size();
int n=ma.size();
int left=0;//循环r字符串
int right=0;//循环ma字符串
if(m>n)
return false;
while(left<m&&right<n)
{
if(r[left]==ma[right])
{
ma[right]='0';
left++;
right=0;//如果相等,将ma的此处字符设为‘0’,r中的字符继续向后走,ma中的字符从头开始匹配。
}
else
right++;
}
int count=0;
for(int i=0;i<n;i++)
{
if(ma[i]=='0')
count++;
}
if(count==m)
return true;
return false;
}
};
刚写完代码,太困了,思路可能有点不清晰了,等脑子清醒了再来修改一遍!