Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

实现一个字符串匹配算法indexOf #136

Open
Sunny-117 opened this issue Nov 3, 2022 · 8 comments
Open

实现一个字符串匹配算法indexOf #136

Sunny-117 opened this issue Nov 3, 2022 · 8 comments

Comments

@Sunny-117
Copy link
Owner

No description provided.

@HangHZhang
Copy link

function myIndexOf(str1,str2) {
    if (str2.length <= 0) return -1
    const shortStr = str1.length >= str2.length ? str2 : str1
    const longStr = shortStr  === str1 ? str2 : str1
    firstChar = shortStr[0]
    let left = 0 
    for (var i = 0; i < longStr.length; i++) {
        left = longStr[i] === firstChar ? i : left
        // console.log(typeof longStr)
        if (longStr.substr(left,shortStr.length) === shortStr) return left 
    }
    return -1
}

console.log(myIndexOf('zhpp','pp')); // 2

@Tylermeek
Copy link

具体实现可能不够精简,但是应该更加符合原indexOf的参数要求

// 实现字符串匹配indexOf方法
// string.indexOf(searchvalue,start)
//        searchvalue:必需。规定需检索的字符串值。
//        start:可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 string Object.length - 1。
//              如省略该参数,则将从字符串的首字符开始检索。
String.prototype.indexOf = function myIndexOf(searchvalue, start = 0) {
    console.log("myIndexOf");
    if (typeof searchvalue !== "string") throw TypeError("需检索值非字符串");
    if (start < 0 || start > this.length)
      throw TypeError(
        "开始检索的位置取值不合法,合法取值是 0 到 string.length - 1"
      );
    for (let index = start; index < this.length; index++) {
      if (this[index] === searchvalue[0]) {
        let len = searchvalue.length;
        let i = 0;
        while (i < len && this[index + i] === searchvalue[i]) {
          // console.log("this[index + i]", this[index + i], searchvalue[i]);
          i++;
        }
        // console.log(i);
        if (i === len) return index;
      }
    }
  };
  
  str = "test tesy";
  console.log(str.indexOf("t"));
  

@gto999
Copy link

gto999 commented Mar 2, 2023

function indexOf(string, substring) {
  if (substring === "") {
    return -1;
  }

  for (var i = 0, len= string.length; i < len; i += 1) {
    if (string.slice(i, i + substring.length) === substring) {
      return i;
    }
  }

  return -1;
}

@fangbw17
Copy link

function indexOf(string, subString = "undefined", startIndex = 0) {
    subString = String(subString)

    startIndex = Number.isInteger(startIndex) ? startIndex : 0
    startIndex = startIndex < 0 ? 0 : startIndex
    
    if (startIndex > string.length) return -1

    if (string === subString) return 0
    
    let res = -1
    for (let index = startIndex; index < string.length; index++) {
        if (string.length - index >= subString.length) {
            const curString = string.slice(index, subString.length + index)
            if (curString === subString) {
                res = index
                break
            }
        }
    }
    return res
}

@MoYuanJun
Copy link

String.prototype.myIndexOf= function(searchValue, position = 0) {
  // 如果 position 大于字符串长度, 则不处理
  if (position > this.length) {
    return -1
  }

  // 如果 position 小于零 按 0 处理
  position = Math.max(position, 0)

  // 循环查找
  for (let i = position; i < this.length; i ++ ) {
    // 截取字符串、判断是否以指定字符串开头
    if (this.substring(i).startsWith(searchValue)) {
      return i
    }
  }

  return -1
}

const str = '0123456789'
const opt = ['4', 1]

console.log(str.myIndexOf(...opt), str.indexOf(...opt))

@JeromeD3
Copy link

拿mdn上面的例子测试过了,基本没啥问题。但是实现起来有点麻烦

String.prototype.myIndexOf = function myIndexOf(searchValue, position = 0) {
  if (typeof searchValue != 'string') {
    throw new Error(`searchValue ${searchValue} 不是字符串`)
  }

  if (searchValue === '') {
    console.log(position < this.length ? position : this.length)
    return position < this.length ? position : this.length
  }

  let start = 0
  let res
  let isStart = true
  for (let i = position; i < this.length; i++) {
    const element = this[i]

    if (isStart) {
      if (element === searchValue[start]) {
        res = i
        isStart = false
      }
    }

    while (element === searchValue[start]) {
      start++
    }

    if (start >= searchValue.length) {
      console.log(res)
      return res
    }
  }

  console.log(-1)
  return -1
}

@woshiarui
Copy link

woshiarui commented May 1, 2023

String.prototype.indexOf = function (searchValue, start = 0) {
  if (typeof searchValue !== "string") {
    throw new Error("type error");
  }
  const len = searchValue.length;
  for (let i = start; i < this.length; i++) {
    if (this.substring(i, i + len) === searchValue) return i;
  }
  return -1;
};

@windlil
Copy link

windlil commented Sep 22, 2023

function myIndexOf(str1, str2) {
  if (str1.length === 0 || str2.length === 0) return -1
  if (str2.length > str1.length) return -1

  let compareStr = {
    str: '',
    index: 0
  }

  for (let i = 0; i < str1.length; i++) {
    for (j = i; j < i + str2.length; j++) {
      if (!str1[j]) return -1
      compareStr.str += str1[j]
      if (compareStr.str === str2) return compareStr.index
    }
    compareStr.index++
    compareStr.str = ''
  }
  return -1
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants