这是用于在字符串中查找Anagram的代码。我如何进一步优化它给我带来错误

发布于 2025-02-09 09:46:22 字数 948 浏览 0 评论 0原文

LeetCode Q:

很好。但是,这给了我一个错误的错误。为了运行此程序,我必须做什么更改?

class Solution {
public List<Integer> findAnagrams(String s, String p) {
    int[] fors=new int[26];
    int[] forp=new int[26];
    for(int i=0;i<p.length();i++){
        forp[p.charAt(i)-'a']++;
    }
    int k=p.length();
    int len=s.length();
    int i=0;
    int j=0;
    ArrayList<Integer> list=new ArrayList<>();
    if(s.length()<p.length()) return list;
    while(j<len){
        fors[s.charAt(j)-'a']++;
        if(j-i+1<k)j++;
        if(j-i+1==k){
            if(areSame(fors,forp)){
                list.add(j-k+1);
                fors[s.charAt(i)-'a']--;
                i++;
                j++;
            }
        }   
    }
    return list;   
}
public boolean areSame(int[] countS, int[] countP){
for(int i=0;i<26;i++){
    if(countS[i]!=countP[i]){
        return false;
    }
}
return true;
}

}

LeetCode Q:https://leetcode.com/problems/find-all-anagrams-in-a-string/

I believe what I have done is perfectly fine. However, it's giving me a TLE error. What changes do I have to do in order to run this program?

class Solution {
public List<Integer> findAnagrams(String s, String p) {
    int[] fors=new int[26];
    int[] forp=new int[26];
    for(int i=0;i<p.length();i++){
        forp[p.charAt(i)-'a']++;
    }
    int k=p.length();
    int len=s.length();
    int i=0;
    int j=0;
    ArrayList<Integer> list=new ArrayList<>();
    if(s.length()<p.length()) return list;
    while(j<len){
        fors[s.charAt(j)-'a']++;
        if(j-i+1<k)j++;
        if(j-i+1==k){
            if(areSame(fors,forp)){
                list.add(j-k+1);
                fors[s.charAt(i)-'a']--;
                i++;
                j++;
            }
        }   
    }
    return list;   
}
public boolean areSame(int[] countS, int[] countP){
for(int i=0;i<26;i++){
    if(countS[i]!=countP[i]){
        return false;
    }
}
return true;
}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

此生挚爱伱 2025-02-16 09:46:22

我看到您的代码有2个问题。首先,关于TLE,您有一个无限的循环,因为您要迭代J,并且我只有在窗户相等的情况下。

if(areSame(fors,forp)){     
    list.add(j-k+1);        
    fors[s.charAt(i)-'a']--;        
    i++;        
    j++;        
}

你应该迭代我,无论如何。解决此问题就像将迭代从if情况外移出一样简单。

if(areSame(fors,forp)){
    list.add(j- p.length() +1);
}
fors[s.charAt(i)-'a']--;
i++;

请注意,我也将S-计数器移出,以便您即使Aresame Checker为False,也可以继续移动。

第二个问题是您如何迭代j。通过在Aresame检查之前递增J,您可以过早检查Windows 1的大小。您可以通过将j迭代移至末尾来解决此问题:)

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        
        int[] fors=new int[26];
        int[] forp=new int[26];
        for(int i=0;i<p.length();i++){
            forp[p.charAt(i)-'a']++;
        }
        
        int i=0;
        int j=0;
        ArrayList<Integer> list=new ArrayList<>();
        if(s.length()<p.length()) return list;
        while(j<s.length()){
            fors[s.charAt(j)-'a']++;

            if(j-i+1== p.length()){
                if(areSame(fors,forp)){
                    list.add(j- p.length() +1);
                }
                fors[s.charAt(i)-'a']--;
                i++;
            }
            j++;
        }
        return list;   
    }
    public boolean areSame(int[] countS, int[] countP){
        for(int i=0;i<26;i++){
            if(countS[i]!=countP[i]){
                return false;
            }
        }
        return true;
    }
}

I see 2 issues with your code. First, regarding TLE, you have an infinite loop because you iterate j and i only if the windows are equal.

if(areSame(fors,forp)){     
    list.add(j-k+1);        
    fors[s.charAt(i)-'a']--;        
    i++;        
    j++;        
}

You should iterate i regardless. Fixing this is as simple as moving the iteration out of the if case.

if(areSame(fors,forp)){
    list.add(j- p.length() +1);
}
fors[s.charAt(i)-'a']--;
i++;

Notice that I also move out the S - counter so that you keep moving even if the areSame checker is false.

The second issue is how you iterate j. By incrementing j before the areSame check, you check the windows 1 size too early. You can fix this by moving the j iteration to the end :)

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        
        int[] fors=new int[26];
        int[] forp=new int[26];
        for(int i=0;i<p.length();i++){
            forp[p.charAt(i)-'a']++;
        }
        
        int i=0;
        int j=0;
        ArrayList<Integer> list=new ArrayList<>();
        if(s.length()<p.length()) return list;
        while(j<s.length()){
            fors[s.charAt(j)-'a']++;

            if(j-i+1== p.length()){
                if(areSame(fors,forp)){
                    list.add(j- p.length() +1);
                }
                fors[s.charAt(i)-'a']--;
                i++;
            }
            j++;
        }
        return list;   
    }
    public boolean areSame(int[] countS, int[] countP){
        for(int i=0;i<26;i++){
            if(countS[i]!=countP[i]){
                return false;
            }
        }
        return true;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文