public int lookFor(String s) {
final int EXIST = 1;
final int NOT_EXIST = -1;
int thisIndex = 0;
int otherIndex = 0;
char thisNext;
char otherNext;
if (s == null || s.length() == 0)
return NOT_EXIST;
for(; thisIndex < this.mainString.length() ; ) {
thisNext = this.mainString.charAt(thisIndex);
otherNext = s.charAt(otherIndex);
if (thisNext == otherNext) {
thisIndex ;
otherIndex ;
}
else if (thisNext != otherNext)
thisIndex ;
if (otherIndex == s.length()-1)
return EXIST;
}
return NOT_EXIST;
}
這是我迄今為止的嘗試。
mainString = 我想在其中找到子字串的主字串。 s = 子字串。
所以我的想法是獲取兩個字串的第一個字符,看看它們是否相等。如果沒有,我將獲得 mainString 的第二個字符,看看它們是否相等(mainString 第二個字符到 s 的第一個字符)。如果它們不相等,我將得到 mainString 的第三個字符等等。一旦它們相等,我將獲得兩個字串的下一個字符,看看它們是否相等。
基本上,當 s 的索引等于 s 長度減 1 時,回圈知道 mainString 包含 s(這意味著回圈一直回圈到 s 的最后一個字符 inc,所以 s index == s length -1)。
我嘗試使用的邏輯不正確嗎?還是我只是執行得不好?我很樂意得到答案!
uj5u.com熱心網友回復:
這是我天真的方法:
private final int EXIST = 1;
private final int NOT_EXIST = -1;
private int lookFor(String a, String b, int index) {
for (int i = 0; i < b.length(); i ) {
if ((index i) >= a.length()) return NOT_EXIST;
if (a.charAt(index i) != b.charAt(i)) return NOT_EXIST;
}
return EXIST;
}
public int lookFor(String a, String b) {
char start = b.charAt(0);
for (int i=0; i < a.length(); i ) {
if (a.charAt(i) == start) {
if (lookFor(a, b, i) == EXIST) return EXIST;
}
}
return NOT_EXIST;
}
雖然,我不知道為什么你會這樣做,而你可以這樣做:
int ret = a.contains(b) ? EXIST : NOT_EXIST
但是我想真正回答你的問題。
這是一個稍微改進的版本,可滿足您的“多合一方法”要求。
public static int lookFor(String a, String b) {
// Fancy way of preventing errors when one of the strings is empty
boolean az = a.length() == 0;
boolean bz = b.length() == 0;
if (az ^ bz) return NOT_EXIST;
// Need this next line if you want to interpret two empty strings as containing eachother
if (az && bz) return EXIST;
char start = b.charAt(0);
// This is known as a "label". Some say it's bad practice.
outer:
for (int i=0; i < a.length(); i ) {
if (a.charAt(i) == start) {
// Instead of using two methods, we can condense it like so
for (int q = 0; q < b.length(); q ) {
if ((i q) >= a.length()) continue outer;
if (a.charAt(i q) != b.charAt(q)) continue outer;
}
return EXIST;
}
}
return NOT_EXIST;
}
uj5u.com熱心網友回復:
要“手動”查找子字串,您需要一個嵌套回圈;即回圈內的回圈。
- 外回圈嘗試字串中子字串的所有可能的起始位置。
- 對于給定的開始位置,內部回圈會根據您正在搜索的字串測驗您正在尋找的字串的所有字符。
在樸素子字串搜索演算法中,外回圈步驟從索引 0 開始,并將索引遞增 1,直到到達被搜索字串的末尾。這可以改進:
每個非空字串“包含”空字串。可能值得將此視為特殊情況。
很容易看出,外回圈通常可以在final之前停止。如果您正在搜索長度為(例如)3 的字串,則外回圈可以在距離末尾 3 處停止。(想想……)
有一些聰明的演算法允許外回圈跳過一些索引。如果您有興趣,請先在 Google 上搜索“Boyer-Moore 字串搜索”。
(注意:回圈可以用 / 使用遞回替換,但它仍然存在。)
您的代碼沒有嵌套回圈。根據我的閱讀,如果您正在搜索的字串位于您正在搜索的字串的開頭,它只會找到匹配項。那是不正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368340.html
下一篇:我遇到了與C 中的字串相關的問題
