#include <iostream>
#include <vector>
using namespace std;
bool wordBreak(string s, vector<string>& wordDict) {
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
for(int i = 1; i != s.size() + 1; i++){
for(auto& word : wordDict){
//i - word.size() >= 0 will be Segmentation fault
//but i >= word.size() not
if(i >= word.size() &&
dp[i - word.size()] && s.substr(i - word.size(), word.size()) == word){
dp[i] = true;
}
}
}
return dp[s.size()];
}
int main(){
string s = "leetcode";
vector<string> wordDict = {"leet", "code"};
if(wordBreak(s, wordDict)) cout << "true" << endl;
else cout << "false" << endl;
return 0;
}
这里有一些代码来解决leetcode 139。在workBreak中,当我使用i - word.size() >= 0
将分段故障,但i >= word.size
没有,为什么?请告诉我详细情况。它可能是关于string.substr()的。我认为I - word.size()>= 0等于I>= word.size.
i - word.size()
为无符号整数,因为word.size()
为无符号整数。因此,i - word.size() >= 0
总是为真。
参见转换规则:https://en.cppreference.com/w/c/language/conversion
章节"常用算术转换":
如果无符号类型的转换等级大于或等于有符号类型的转换等级,则带符号类型的操作数隐式转换为无符号类型。
int
和unsigned int
具有相同的转换等级,因为它们具有相同的字节数。这在"整数提升"一节中有解释。