返回介绍

solution / 1000-1099 / 1065.Index Pairs of a String / README

发布于 2024-06-17 01:03:31 字数 5797 浏览 0 评论 0 收藏 0

1065. 字符串的索引对

English Version

题目描述

给出 字符串 text 和 字符串列表 words, 返回所有的索引对 [i, j] 使得在索引对范围内的子字符串 text[i]...text[j](包括 i 和 j)属于字符串列表 words

 

示例 1:

输入: text = "thestoryofleetcodeandme", words = ["story","fleet","leetcode"]
输出: [[3,7],[9,13],[10,17]]

示例 2:

输入: text = "ababa", words = ["aba","ab"]
输出: [[0,1],[0,2],[2,3],[2,4]]
解释: 
注意,返回的配对可以有交叉,比如,"aba" 既在 [0,2] 中也在 [2,4] 中

 

提示:

  1. 所有字符串都只包含小写字母。
  2. 保证 words 中的字符串无重复。
  3. 1 <= text.length <= 100
  4. 1 <= words.length <= 20
  5. 1 <= words[i].length <= 50
  6. 按序返回索引对 [i,j](即,按照索引对的第一个索引进行排序,当第一个索引对相同时按照第二个索引对排序)。

解法

方法一:暴力枚举

class Solution:
  def indexPairs(self, text: str, words: List[str]) -> List[List[int]]:
    words = set(words)
    n = len(text)
    return [
      [i, j] for i in range(n) for j in range(i, n) if text[i : j + 1] in words
    ]
class Trie {
  Trie[] children = new Trie[26];
  boolean isEnd = false;

  void insert(String word) {
    Trie node = this;
    for (char c : word.toCharArray()) {
      c -= 'a';
      if (node.children[c] == null) {
        node.children[c] = new Trie();
      }
      node = node.children[c];
    }
    node.isEnd = true;
  }
}

class Solution {
  public int[][] indexPairs(String text, String[] words) {
    Trie trie = new Trie();
    for (String w : words) {
      trie.insert(w);
    }
    int n = text.length();
    List<int[]> ans = new ArrayList<>();
    for (int i = 0; i < n; ++i) {
      Trie node = trie;
      for (int j = i; j < n; ++j) {
        int idx = text.charAt(j) - 'a';
        if (node.children[idx] == null) {
          break;
        }
        node = node.children[idx];
        if (node.isEnd) {
          ans.add(new int[] {i, j});
        }
      }
    }
    return ans.toArray(new int[ans.size()][2]);
  }
}
class Trie {
public:
  vector<Trie*> children;
  bool isEnd = false;

  Trie() {
    children.resize(26);
  }

  void insert(string word) {
    Trie* node = this;
    for (char c : word) {
      c -= 'a';
      if (!node->children[c]) node->children[c] = new Trie();
      node = node->children[c];
    }
    node->isEnd = true;
  }
};

class Solution {
public:
  vector<vector<int>> indexPairs(string text, vector<string>& words) {
    Trie* trie = new Trie();
    for (auto w : words) trie->insert(w);
    int n = text.size();
    vector<vector<int>> ans;
    for (int i = 0; i < n; ++i) {
      Trie* node = trie;
      for (int j = i; j < n; ++j) {
        int idx = text[j] - 'a';
        if (!node->children[idx]) break;
        node = node->children[idx];
        if (node->isEnd) ans.push_back({i, j});
      }
    }
    return ans;
  }
};
type Trie struct {
  children [26]*Trie
  isEnd  bool
}

func newTrie() *Trie {
  return &Trie{}
}

func (this *Trie) insert(word string) {
  node := this
  for _, c := range word {
    idx := int(c - 'a')
    if node.children[idx] == nil {
      node.children[idx] = newTrie()
    }
    node = node.children[idx]
  }
  node.isEnd = true
}

func indexPairs(text string, words []string) [][]int {
  trie := newTrie()
  for _, w := range words {
    trie.insert(w)
  }
  n := len(text)
  var ans [][]int
  for i := range text {
    node := trie
    for j := i; j < n; j++ {
      idx := int(text[j] - 'a')
      if node.children[idx] == nil {
        break
      }
      node = node.children[idx]
      if node.isEnd {
        ans = append(ans, []int{i, j})
      }
    }
  }
  return ans
}

方法二:前缀树

相似题目:

class Trie:
  def __init__(self):
    self.children = [None] * 26
    self.is_end = False

  def insert(self, word):
    node = self
    for c in word:
      idx = ord(c) - ord('a')
      if node.children[idx] is None:
        node.children[idx] = Trie()
      node = node.children[idx]
    node.is_end = True


class Solution:
  def indexPairs(self, text: str, words: List[str]) -> List[List[int]]:
    trie = Trie()
    for w in words:
      trie.insert(w)
    n = len(text)
    ans = []
    for i in range(n):
      node = trie
      for j in range(i, n):
        idx = ord(text[j]) - ord('a')
        if node.children[idx] is None:
          break
        node = node.children[idx]
        if node.is_end:
          ans.append([i, j])
    return ans

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文