[ルーキートレーニング]ソードフィンガーオファー48.繰り返し文字のない最長の部分文字列

タイトル説明:

文字列から繰り返し文字を含まない最長の部分文字列を見つけて、最長の部分文字列の長さを計算してください。

例1:
入力: "abcabcbb"
出力:3
説明:文字が繰り返されていない最長の部分文字列は "abc"であるため、その長さは3です。

例2:
入力: "bbbbb"
出力:1
説明:文字が繰り返されていない最長の部分文字列は "b"であるため、その長さは1です。

例3:
入力: "pwwkew"
出力:3
説明:文字が繰り返されていない最長の部分文字列は "wke"であるため、その長さは3です。
答えは部分文字列の長さでなければならないことに注意してください。「pwke」は部分文字列ではなく部分列です。

ヒント:
s.length <= 40000

出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
the copyright襟はネットワークが所有しています。商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。

問題解決のアイデア:

方法1:暴力一見したところ、この問題の最も簡単な解決策はセットを使用することです。ここでは、最初にListを使用してそれを行うことを考えました。これには、おそらく2つのループが必要であり、時間計算量はO(n²)です。新しいリストに移動するたびに、スペースの複雑さも非常に高くなります。この方法はお勧めしません。
このメソッドは、文字列内の各要素を隣り合わせにトラバースして、最大の一意の部分文字列を見つけます。次の要素が繰り返されない場合は、list.add(要素)になります。繰り返される場合は、この部分文字列が次のようになります。最長。内側のループから飛び出して、リストの長さを以前に取得した最長の長さと比較して更新する必要があります。

方法2:コメント領域を見てください。スライドウィンドウとdpを使用した解決策はたくさんあります。最初に考えて、後で追加します。

コード:

public class jianzhi_Offer_48 {
    
    
    //暴力
    public int lengthOfLongestSubstring(String s) {
    
    
        if (s.length() == 0){
    
    
            return 0;
        }
        int maxnum = 1;
        for (int i = 0; i < s.length(); i++) {
    
    
            ArrayList list = new ArrayList();
            for (int j = i; j < s.length(); j++) {
    
    
                if (list.contains(s.charAt(j)) == false) {
    
    
                    list.add(s.charAt(j));
                }
                else {
    
    
                    break;
                }
            }
            maxnum = Math.max(maxnum,list.size());
        }
        return maxnum;
    }

    public static void main(String[] args) {
    
    
        jianzhi_Offer_48 obj = new jianzhi_Offer_48();
        System.out.println(obj.lengthOfLongestSubstring("au"));

    }
}

おすすめ

転載: blog.csdn.net/Puppet__/article/details/115164325