bool wordBreak(string s, vector<string> &wordDict) {
vector<int> bArr(s.length(), -1);
unordered_set<string> set(wordDict.begin(), wordDict.end());
return wordBreak(s, bArr, 0, set);
}
bool wordBreak(string s, vector<int> &bArr, int start, unordered_set<string> &set) {
if (start == s.length())
return true;
//If we have a memoized solution to this problem, avoid recurion
if (bArr[start] != -1)
return (bArr[start] == 1);
for (int end = start + 1; end <= s.length(); end++) {
if (set.count(s.substr(start, end)) && wordBreak(s, bArr, end, set)) {
bArr[start] = 1;
return bArr[start] == 1;
}
}
bArr[start] = 0;
return false;
}
使用Java的工作代码:
public boolean wordBreak(String s, List<String> wordDict) {
Integer[] memo =new Integer[s.length()];
Arrays.fill(memo,-1);
return word_Break(s, new HashSet(wordDict), 0, memo);
}
public boolean word_Break(String s, Set<String> wordDict, int start, Integer[] memo) {
if (start == s.length()) {
return true;
}
if (memo[start] != -1) {
return memo[start]==1;
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end)) && word_Break(s, wordDict, end, memo)) {
memo[start] = 1;
return memo[start] == 1;
}
}
memo[start] = 0;
return false;
}
C++代码用dictionary[“Apple”,“Pen”]返回“ApplePenApple”的false,我不知道为什么java返回true是正确的。这两种解决方案之间唯一的主要区别(我认为)是我的C++在java代码中使用向量而不是原生数组。最初,我认为这可能与C++使用自动存储(堆栈)而不是自由存储(堆)有关,这就是为什么我使用向量而不是C样式的数组来避免内存管理,因为RAII。尽管进行了这种更改,但bug仍然存在。有一个更简单的解决方案完全避免递归,但我很好奇为什么C++返回的输出与Java不同。
我看到了一个潜在的问题。来自java.lang.string
Javadoc(强调是我的):
公共字符串子字符串(int beginIndex,int endIndex)
返回一个新字符串,该字符串是此字符串的子字符串。子字符串从指定的beginIndex开始,并扩展到索引endIndex-1处的字符。因此,子字符串的长度是endindex-beginindex。
"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"
beginIndex-开始索引,包括在内。
endIndex-结束索引,排他。
来自cpPreference.com字符串文档:
也就是说,在Java中,您应该将索引作为第二个参数传递给string.substring(...)
,但是在C++中,您应该将长度传递给basic_string::substr(...)
。但是,您正在做:
s.substr(start, end)
和
s.substring(start, end)
在这两种情况下。
s.substr(start, end - start)
本文向大家介绍C++与C的差异分析,包括了C++与C的差异分析的使用技巧和注意事项,需要的朋友参考一下 虽说C++是向后兼容C的,但C++与C还是存在许多差异。本文列举了几个例子加以说明,同时这些也是我们非常容易忽略的地方。本文仅简单的列举几例,更多的不同之处读者还需要在学习与实践中不断的进行发掘和总结。 C编译通过但C++编译不通过: 1、C++中编译器不允许在一个函数声明之前调用它,但C中编译
刚从C开始,我想知道是否有人能解释一些事情。 我相信你可以用下面的方法初始化一个字符数组 这将创建一个字符数组,其值为。 但如果我真的创造了这个: 会创建一个数组,以及指向该数组的指针吗? 例如:将指向内存中的第一个元素,以及数组中的其他元素?
我有以下类和内部“AsyncTask”(http://developer.android.com/reference/android/os/AsyncTask.html)定义。 我很好奇,对于异步任务的“内存可见性”以及线程安全,我得到了什么样的保证。根据我的理解,调用“doInBackground”是在一个单独的线程中执行的,因此我对“doInBackground”中的“b”所做的任何更改都不能
问题内容: 我的代码中有一些函数,使用记忆很有意义(甚至是强制性的)。 我不想为每个功能分别手动实现。有什么办法(例如在Python中),我可以只使用注释或做其他事情,以便在需要的地方自动获得这些注释? 问题答案: Spring 3.1现在提供了一个注释,它可以做到这一点。 顾名思义,@Cacheable用于划分可缓存的方法-即将结果存储到缓存中的方法,以便在后续调用(具有相同参数)时返回缓存中的
我的想法是有一个这样的东西,您可以在其中存储以前的答案并在以后查找它们。我想这可以通过lambda表达式来完成,但我不太熟悉它们。我不太确定如何编写这个方法,希望得到一些帮助。 用这种方法能做到这一点吗?
我正试图在过期日期前三天,但我不知道如何发送? 思维方式 检索剩余三天到期的所有订阅者 发送电子邮件给他们的用户 代码 表我需要检查名为 这个表有一个名为的列,我需要检查它以找到