day09 | 字符串2 | 雙指針?lè)偨Y(jié)

0.引言

●28. 實(shí)現(xiàn) strStr()
●459.重復(fù)的子字符串
●字符串總結(jié)
●雙指針回顧

1.找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo)

Category Difficulty Likes Dislikes
algorithms Medium (42.09%) 1771 -

給你兩個(gè)字符串 haystackneedle 派草,請(qǐng)你在 haystack 字符串中找出 needle 字符串的第一個(gè)匹配項(xiàng)的下標(biāo)(下標(biāo)從 0 開(kāi)始)抱既。如果 needle 不是 haystack 的一部分谚殊,則返回 -1腐晾。

示例 1:

輸入:haystack = "sadbutsad", needle = "sad"
輸出:0
解釋?zhuān)?sad" 在下標(biāo) 0 和 6 處匹配。
第一個(gè)匹配項(xiàng)的下標(biāo)是 0 呀洲,所以返回 0 舅柜。

示例 2:

輸入:haystack = "leetcode", needle = "leeto"
輸出:-1
解釋?zhuān)?leeto" 沒(méi)有在 "leetcode" 中出現(xiàn),所以返回 -1 捺僻。

提示:

  • 1 <= haystack.length, needle.length <= 10<sup>4</sup>
  • haystackneedle 僅由小寫(xiě)英文字符組成

Discussion | Solution

1.1.自己想法及代碼實(shí)現(xiàn)

  • 暴力法走一波?
/*
 * @lc app=leetcode.cn id=28 lang=cpp
 *
 * [28] 找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo)
 */

// @lc code=start
class Solution {
 public:
  int strStr(string haystack, string needle) {
    if (needle.size() > haystack.size()) return -1;
    int idx1 = 0;
    while (idx1 <= haystack.size() - needle.size()) {
      if (str_contain_check(haystack, needle, idx1)) {
        return idx1;
      } else {
        idx1++;
      }
    }
    return -1;
  }

 private:
  bool str_contain_check(const std::string& str1, const std::string& str2,
                         int str1_idx) {
    if (str1.size() - str1_idx < str2.size()) return false;
    int str2_idx = 0;
    while (str2_idx < str2.size()) {
      if (str1[str1_idx] != str2[str2_idx]) {
        return false;
      }
      str1_idx++;
      str2_idx++;
    }
    return true;
  }
};
// @lc code=end

暴力解法竟然不會(huì)超時(shí)呀


image.png

1.2.參考思想及代碼實(shí)現(xiàn)

KMP 算法

2.重復(fù)的子字符串

Category Difficulty Likes Dislikes
algorithms Easy (51.17%) 901 -

給定一個(gè)非空的字符串 s 崇裁,檢查是否可以通過(guò)由它的一個(gè)子串重復(fù)多次構(gòu)成匕坯。

示例 1:

輸入: s = "abab"
輸出: true
解釋: 可由子串 "ab" 重復(fù)兩次構(gòu)成。

示例 2:

輸入: s = "aba"
輸出: false

示例 3:

輸入: s = "abcabcabcabc"
輸出: true
解釋: 可由子串 "abc" 重復(fù)四次構(gòu)成寇壳。 (或子串 "abcabc" 重復(fù)兩次構(gòu)成。)

提示:

  • 1 <= s.length <= 10<sup>4</sup>
  • s 由小寫(xiě)英文字母組成

Discussion | Solution

2.1.自己想法及代碼實(shí)現(xiàn)

  • 同樣使用暴力法妻怎,碰了一鼻子灰:
/*
 * @lc app=leetcode.cn id=459 lang=cpp
 *
 * [459] 重復(fù)的子字符串
 */

// @lc code=start
class Solution {
 public:
  bool repeatedSubstringPattern(string s) {
    if (s.size() == 1) return false;
    // todo
    std::string substr = find_substr(s, 0);
    std::cout << "substr: " << substr;
    if (str_contain_repeat(s, substr)) {
      return true;
    }
    return false;
  }

 private:
  std::string find_substr(const string& str, uint8_t skip) {
    if (str.empty()) return "";
    int idx = 1;
    char cmp_char = str[0];
    uint8_t count_cmp_char = 0;
    while (idx < str.size()) {
      if (str[idx] == cmp_char) {
        if (count_cmp_char == skip) {
          return str.substr(0, idx);
        }
        count_cmp_char++;
      }
      idx++;
    }
    return "";
  }

  bool str_contain_repeat(const std::string& str1, const std::string& str2) {
    if (str1.size() % str2.size() != 0) return false;
    int times = 0, size_times = str1.size() / str2.size();
    while (times < size_times) {
      // 左閉右開(kāi)
      int str2_idx = 0;
      while (str2_idx < str2.size()) {
        int str1_idx = times * str2.size() + str2_idx;
        if (str1[str1_idx] != str2[str2_idx])
          return false;
        else
          str2_idx++;
      }
      times++;
    }
    return true;
  }
};

image.png

這個(gè)test case本身就很魔幻壳炎。還是得KMP解題,畢竟這就是量身打造的題目。

2.2.參考思想及代碼實(shí)現(xiàn)

挖坑D浔纭腰耙!

3.總結(jié)

周末需要再過(guò)一遍,自己再動(dòng)手總結(jié)一下铲球。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挺庞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稼病,更是在濱河造成了極大的恐慌选侨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件然走,死亡現(xiàn)場(chǎng)離奇詭異援制,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)芍瑞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)晨仑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拆檬,你說(shuō)我怎么就攤上這事洪己。” “怎么了竟贯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵答捕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我澄耍,道長(zhǎng)噪珊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任齐莲,我火速辦了婚禮痢站,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘选酗。我一直安慰自己阵难,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布芒填。 她就那樣靜靜地躺著呜叫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殿衰。 梳的紋絲不亂的頭發(fā)上朱庆,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音闷祥,去河邊找鬼娱颊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箱硕。 我是一名探鬼主播拴竹,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剧罩!你這毒婦竟也來(lái)了栓拜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惠昔,失蹤者是張志新(化名)和其女友劉穎幕与,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舰罚,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纽门,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了营罢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赏陵。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饲漾,靈堂內(nèi)的尸體忽然破棺而出蝙搔,到底是詐尸還是另有隱情,我是刑警寧澤考传,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布吃型,位于F島的核電站,受9級(jí)特大地震影響僚楞,放射性物質(zhì)發(fā)生泄漏勤晚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一泉褐、第九天 我趴在偏房一處隱蔽的房頂上張望赐写。 院中可真熱鬧,春花似錦膜赃、人聲如沸挺邀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)端铛。三九已至乏苦,卻和暖如春面粮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绑洛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工狂丝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留换淆,地道東北人虚倒。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像产舞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菠剩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容