LeetCode 2781. Length of the Longest Valid Substring

原题链接在这里:https://leetcode.com/problems/length-of-the-longest-valid-substring/description/

题目:

You are given a string word and an array of strings forbidden.

A string is called valid if none of its substrings are present in forbidden.

Return the length of the longest valid substring of the string word.

A substring is a contiguous sequence of characters in a string, possibly empty.

Example 1:

Input: word = "cbaaaabc", forbidden = ["aaa","cb"]
Output: 4
Explanation: There are 11 valid substrings in word: "c", "b", "a", "ba", "aa", "bc", "baa", "aab", "ab", "abc" and "aabc". The length of the longest valid substring is 4. 
It can be shown that all other substrings contain either "aaa" or "cb" as a substring. 

Example 2:

Input: word = "leetcode", forbidden = ["de","le","e"]
Output: 4
Explanation: There are 11 valid substrings in word: "l", "t", "c", "o", "d", "tc", "co", "od", "tco", "cod", and "tcod". The length of the longest valid substring is 4.
It can be shown that all other substrings contain either "de", "le", or "e" as a substring. 

Constraints:

  • 1 <= word.length <= 105
  • word consists only of lowercase English letters.
  • 1 <= forbidden.length <= 105
  • 1 <= forbidden[i].length <= 10
  • forbidden[i] consists only of lowercase English letters.

题解:

The question is asking for the longest substring with no forbidden word.

Iterate from right to left using index i, and from to right index j, if word[i, j] is forbidden, mark the right position.

Update the result for each index i.

Time Complexity: O(m * maxLen + n * maxLen * maxLen). m = forbidden.size(). n = word.length(). 

Space: O(m * maxLen).

AC Java:

复制代码
 1 class Solution {
 2     public int longestValidSubstring(String word, List<String> forbidden) {
 3         Set<String> hs = new HashSet<>();
 4         int maxLen = 0;
 5         for(String s : forbidden){
 6             hs.add(s);
 7             maxLen = Math.max(maxLen, s.length());
 8         }
 9 
10         int res = 0;
11         int n = word.length();
12         int right = n - 1;
13         for(int i = n - 1; i >= 0; i--){
14             for(int j = i; j <= Math.min(i + maxLen, right); j++){
15                 if(hs.contains(word.substring(i, j + 1))){
16                     right = j - 1;
17                     break;
18                 }
19             }
20 
21             res = Math.max(res, right - i + 1);
22         }
23 
24         return res;
25     }
26 }
复制代码

 

posted @   Dylan_Java_NYC  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示