首页 > 试题广场 >

最长连续子字符串

[编程题]最长连续子字符串
  • 热度指数:1707 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
输入一个字符串 s ,请返回该字符串的“只包含一种字符的最长非空子字符串”。

数据范围:
进阶:空间复杂度 ,时间复杂度
示例1

输入

"ssssssssssssssshhhhopeeeeeeee"

输出

"sssssssssssssss"
示例2

输入

""

输出

""

错误详情

用例输入 "LLLLLLLlllllooooolllll"
预期输出 "LLLLLLLlllll"
实际输出 "LLLLLLL"
??? 这个输入case是认真的么???

输入一个字符串s,请返回该字符串的“只包含一种字符的最长非空子字符串”。
Ll 能严谨点儿么?

发表于 2021-09-04 17:37:30 回复(6)
一边遍历字符串中的字符,一边对连续相同的字符进行计数,找到最长的就行。但本题有个坑:“字符如果只是字母大小写的区别,也算作相等。”
这个条件讲道理应该写在题面上,不然我咋调试?或者你给的示例里有这种情况也可啊。
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 1 <= str.length <= 1000
     * @return string字符串
     */
    public String findLongestSubstr (String str) {
        // write code here
        char[] chars = str.toCharArray();
        char prevChar = chars[0];
        int count = 1;
        int maxLen = 1;
        StringBuilder res = new StringBuilder();
        res.append(prevChar);
        StringBuilder temp = new StringBuilder();
        temp.append(prevChar);
        for(int i = 1; i < chars.length; i++){
            if(equalsIgnoreCase(chars[i], prevChar)){
                temp.append(chars[i]);
                prevChar = chars[i];
            }else{
                if(temp.length() > maxLen) {
                    res = temp;
                    maxLen = temp.length();
                }
                prevChar = chars[i];
                temp = new StringBuilder();
                temp.append(prevChar);
            }
        }
        if(temp.length() > maxLen) res = temp;
        return res.toString();
    }
    
    // 忽略大小写的字符比较
    private boolean equalsIgnoreCase(char c1, char c2) {
        if(c1 >= 'A' && c1 <= 'Z' && c2 >= 'A' && c2 <= 'Z')
            return c1 == c2;
        else if(c1 >= 'A' && c1 <= 'Z'){
            char newC1 = (char)(c1 + 32);
            return newC1 == c2;
        }else if(c2 >= 'A' && c2 <= 'Z'){
            char newC2 = (char)(c2 + 32);
            return c1 == newC2;
        }
        return c1 == c2;
    }
}

编辑于 2021-09-24 15:44:58 回复(0)
通过8/10,好想知道没通过的用例是啥...
function findLongestSubstr( str ) {
    if(!str) return "";
    var strLen=str.length;
    var arr=[];
    var len=1;
    //把每个相同字符的子串都存到数组中
    for(let i=0;i<strLen;i++){
       if(str[i+1]===str[i]){
           len++;
       }else{
           arr.push(str.substr(i-len+1,len));
           len=1;
       }
    }
    var maxStr="";
    var maxLen=0;
    var arrLen=arr.length;
    //遍历找出最长子串
    for(let i=0;i<arrLen;i++){
        if(maxLen<arr[i].length){
            maxLen=arr[i].length;
            maxStr=arr[i];
        }
    }
    return maxStr;
}
module.exports = {
    findLongestSubstr : findLongestSubstr
};


发表于 2021-08-27 19:53:42 回复(1)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 1 <= str.length <= 1000
 * @return string字符串
 */
function findLongestSubstr( str ) {
    // write code here
    //判断特殊情况
    if(str.length < 2) return str

    let arr = [] , len = 1
    for(let i = 1 ; i < str.length ; i ++){
        if(str[i].toLowerCase() == str[i-1].toLowerCase()){
            len ++
        }else{
            arr.push(str.substring(i-len,i))
            len = 1
        }
        //那如果是都相等呢,那就没有push进去
    }
    //判断处理那种情况
    if(len === str.length) return str
    let maxStr = ''
    let maxLen = 0
    console.log(arr)
    for(let i = 0 ; i < arr.length ; i ++){
        if(arr[i].length > maxLen){
            maxStr = arr[i]
            maxLen = arr[i].length
        }
    }
    return maxStr
}
module.exports = {
    findLongestSubstr : findLongestSubstr
};

发表于 2024-10-28 20:07:37 回复(0)
出题不严谨,笑了
发表于 2022-07-01 22:14:44 回复(0)
 function fun(str){
if (str == '') {
        return '';
    }
    var ans = 1, temp = 1;    //计数重复字符个数,此题没要求
    var str2 = str[0];       //str2保存连续子字符串
    var arr = [];            //将各阶段str2保存至数组,方便后面求取比较最长子串
    arr[0] = str[0];          //考虑单个字符情况
    for (let i = 1; i < str.length; i++) {
        if (str[i] == str[i - 1] || str[i] == str[i - 1].toUpperCase() || str[i] == str[i - 1].toLowerCase()) {
            temp++;
            str2 = str2.concat(str[i]);
            arr.push(str2);
            //console.log(str2);
        } else {
            temp = 1;
            str2 = str[i];
        }
        ans = Math.max(temp, ans);
    }
    var arr = arr.sort(
        (a, b) => { return b.length - a.length; }
    );
   // console.log(arr[0]);
    
   // console.log(ans);
    return arr[0];
};
fun('LLLLLLLlllllllooooolllll');

考虑了大小写的情况。代码中对相同字符的字符串进行了字符个数计数,可忽略。
编辑于 2022-06-30 11:42:01 回复(0)
调了半天终于通过所有测例了😂😂
class Solution:
    def findLongestSubstr(self , str ):
        # write code here
        if str=='': return ''
        if len(str)==1: return str
        pre=str[0]
        temp=pre
        maxlen=''
        data=[]
        for i in range(1,len(str)+1):
            if i==len(str):
                data.append(temp)
                print(temp)
                strlens=[len(ch) for ch in data]
                maxlen=max(strlens)
                for ch in data:
                    if len(ch)==maxlen:
                        return ch
            if str[i].lower()==pre.lower():
                temp+=str[i]
                pre=str[i]
            else:
                print(temp)
                data.append(temp)
                pre=str[i]
                temp=pre


发表于 2022-04-19 11:05:10 回复(0)
function findLongestSubstr( str ) {
  // write code here
  if(str.length === 0) return ''
  if(str.length === 1) return str
  
  const re = /(\w)\1*/g;

  const arr = str.match(re)
  
  if(arr.length){
    return arr.reduce((item1, item2) => {
      return item1.length > item2.length ? item1 : item2
    })
  }

  return ''
}
想知道官方的case是什么,怎么没有完全通过?

发表于 2022-03-31 19:01:10 回复(0)
 function findLongestSubstr(str) {
        if(str === ""){return str}
        let arr = str.split("")
        let res = ""

       function loop(arr2){
           for(let i=0;i<arr2.length-1;i++){
               if(arr2[i] != arr2[i+1]){
                   let temp = arr2.splice(0,i+1).join("")    //splice更改了原数组,返回的是被删除的数组
                   if(temp.length>res.length){
                       res = temp
                   }
               }
           }
       }
        loop(arr)
        //考虑最后剩余的数组
        let strLastArr = arr.join("")
        if(strLastArr.length>res.length){
            res = strLastArr
        }
        return res;
    }

发表于 2022-03-12 17:12:52 回复(0)
function findLongestSubstr(str) {
  str += "!"; // 给字符串末尾补一位
  let res = "";
  let temp = "";
  for (let i = 0; i < str.length - 1; i++) {
    if (str[i].toLowerCase() === str[i + 1].toLowerCase()) {
      temp += str[i];
    } else {
      temp += str[i];
      if (temp.length > res.length) {
        res = temp;
      }
      temp = "";
    }
  }
  return res;
}

发表于 2022-03-11 17:20:51 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 1 <= str.length <= 1000
 * @return string字符串
 shhpppoo
 */
function findLongestSubstr( str ) {
    let  ans = '';
    for (let left = 0, right = 0; right <= str.length; right++) {
        if (right === str.length || str[left].toLowerCase() !== str[right].toLowerCase()) {
            if (right - left > ans.length) {
                ans = str.slice(left, right);
            }
            left = right;
        }
    }
    return ans;
}


module.exports = {
    findLongestSubstr : findLongestSubstr
};
发表于 2022-03-02 18:51:11 回复(0)
function getLongestSubString(str) {
    if (!str || str === "") return str;
    let maxLen = 0,startPos=0,endPos,lastChar=null,maxLenStart=[],maxLenEnd=[];
    str.split("").map((s,index)=>{
        lastChar = lastChar || s;
        if(lastChar === s){
            endPos = index+1;
        }
        if(lastChar!==s||index===str.length-1){

            let len = endPos - startPos;
            maxLen = Math.max(maxLen,len);
            // maxLenStart = maxLen === len? startPos:maxLenStart;
            // maxLenEnd = mmaxLen === len? endPos:maxLenEnd;
            if(maxLen == len){
                maxLenStart.push(startPos);
                maxLenEnd.push(endPos);
            }

            lastChar = s;
            startPos = index;
            endPos = index+1;
        }
    });
    for(let i=0;i<maxLenStart.length;){
        if(maxLen!==maxLenEnd[i]-maxLenStart[i]){
            maxLenStart.splice(i,1);
            maxLenEnd.splice(i,1);
        }else
            i++;
    }
    let allSubString = [];
    maxLenStart.forEach((startPos,index)=>{
        allSubString.push(str.substring(startPos, maxLenEnd[index]));
        // console.log(allSubString[index]);
    })
    return allSubString;
}

发表于 2022-02-16 16:14:58 回复(0)
function findLongestSubstr( str ) {
    //将数组转化成字符串
    var arr = str.split('')
    //数组去重
    var arr1 = [...new Set(arr)]
    var max = arr1[0]
    //已去重数组中的每个元素为分割字符,找出最分割后数组长度最长的字符,该字符就是原字符串中最长的子字符串
    for (var i = 0; i < arr.length; i++) {
       if (str.split(max).length < str.split(arr[i]).length){ 
           str.split(max).length = str.split(arr[i]).length;
        }
    }
    var str1 = arr.filter((item)=>{return item==max})
    return str1.join('')
}
console.log(findLongestSubstr("ssssssssssssssshhhhopeeeeeeee"))
module.exports = {
    findLongestSubstr : findLongestSubstr
};

发表于 2021-09-21 20:27:06 回复(0)
function findLongestSubstr( str ) {
    // write code here
    return str.match(/(.)\1*/ig).reduce((pre,cur)=>pre.length<cur.length?cur:pre,"");
}
发表于 2021-09-04 16:26:25 回复(0)
function findLongestSubstr( str ) {
    // write code here
      str=str.split('');
     
    let i=0,j=0,rst="";
    while(j<str.length){
        if(str[i].toLowerCase()==str[j].toLowerCase())
        {
           j++;
        }else{
           let prev=str.slice(i,j);
           console.log(prev);
            if(rst.length<prev.length)
            {
               rst=prev;
            }
            i=j;
        }
    }
    lastStr=str.slice(i);
    if(lastStr.length>rst.length)
    {
        rst=lastStr;
    }
    return rst.join("");
}
发表于 2021-08-31 22:30:23 回复(0)
function findLongestSubstr( str ) {
    // f(i) = f(i - 1)&nbs***bsp;1
    let max = str[0];
    const dp = new Array(str.length).fill(0);
    
    // basecase
    dp[0] = 1;
    
    for(let i = 1; i < str.length; i++) {
        if(str[i - 1].toLowerCase() === str[i].toLowerCase()) {
            dp[i] = dp[i - 1] + 1;
        } else {
            dp[i] = 1;
        }
        max = dp[i] > max.length ? str.slice(i + 1 - dp[i], i + 1) : max;
    }
    
    return max;
}

编辑于 2021-08-30 21:22:16 回复(0)
function findLongestSubstr(str) {
        let arr = str.split("");
        let res = "";
        function loop(arr2) {
          for (let i = 0; i < arr2.length - 1; i++) {
            if (arr2[i].toLowerCase() != arr2[i + 1].toLowerCase()) {
              let temp = arr2.splice(0, i + 1).join("");
              if (temp.length > res.length) {
                res = temp;
              }
              loop(arr2);
            }
          }
        }
        loop(arr);

        arr = arr.join("");
        if (arr.length > res.length) {
          res = arr;
        }
        console.log(res);
        return res;
      }

发表于 2021-08-25 23:37:37 回复(0)