it-swarm-vi.com

Làm thế nào với phần thưởng của chúng tôi xem như một phần của chúng

Thông thường tôi sẽ mong đợi một phương thức String.contains(), nhưng dường như không có một phương pháp nào.

Một cách hợp lý để kiểm tra này là gì?

7434
gramm

Giới thiệu ES6 String.prototype.includes :

var string = "foo",
    substring = "oo";

string.includes(substring)

includesdoesn Có có IE hỗ trợ , mặc dù. Trong môi trường ES5 trở lên, String.prototype.indexOf , trả về −1 khi nó không tìm thấy chuỗi con, có thể được sử dụng thay thế:

var string = "foo",
    substring = "oo";

string.indexOf(substring) !== -1
12677
Fabien Ménager

String.prototype.includes trong ES6 :

"potato".includes("to");
> true

Lưu ý rằng này không hoạt động trong Internet Explorer hoặc một số trình duyệt cũ khác không có hoặc không hỗ trợ ES6. Để làm cho nó hoạt động trong các trình duyệt cũ, bạn có thể muốn sử dụng một bộ chuyển mã như Babel , một thư viện shim như es6-shim , hoặc polyfill từ MDN :

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }

    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}
438
eliocs

Một cách khác là KMP .

Thuật toán KMP cung cấp tìm kiếm chuỗi thời gian tuyến tính trong trường hợp xấu nhất, vì vậy đây là một cách hợp lý nếu bạn quan tâm đến độ phức tạp của thời gian trong trường hợp xấu nhất.

Đây là một triển khai JavaScript của Project Nayuki, được lấy từ https://www.nayuki.io/res/knuth-morris-pratt-opes-matching/kmp-opes-matcher.js :

// Searches for the given pattern string in the given text string using the Knuth-Morris-Pratt string matching algorithm.
// If the pattern is found, this returns the index of the start of the earliest match in 'text'. Otherwise -1 is returned.
function kmpSearch(pattern, text) {
    if (pattern.length == 0)
        return 0;  // Immediate match

    // Compute longest suffix-prefix table
    var lsp = [0];  // Base case
    for (var i = 1; i < pattern.length; i++) {
        var j = lsp[i - 1];  // Start by assuming we're extending the previous LSP
        while (j > 0 && pattern.charAt(i) != pattern.charAt(j))
            j = lsp[j - 1];
        if (pattern.charAt(i) == pattern.charAt(j))
            j++;
        lsp.Push(j);
    }

    // Walk through text string
    var j = 0;  // Number of chars matched in pattern
    for (var i = 0; i < text.length; i++) {
        while (j > 0 && text.charAt(i) != pattern.charAt(j))
            j = lsp[j - 1];  // Fall back in the pattern
        if (text.charAt(i) == pattern.charAt(j)) {
            j++;  // Next char matched, increment position
            if (j == pattern.length)
                return i - (j - 1);
        }
    }
    return -1;  // Not found
}

Ví dụ sử dụng:

kmpSearch('ays', 'haystack') != -1 // true
kmpSearch('asdf', 'haystack') != -1 // false
8
wz366