C#刷Leetcode 1662. 检查两个字符串数组是否相等 IEnumerator

Posted 有数可据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#刷Leetcode 1662. 检查两个字符串数组是否相等 IEnumerator相关的知识,希望对你有一定的参考价值。

今天刷Leetcode时候,发现一道有趣的题目,拿出来和大家分享一下。

题目地址:
Leetcode美国版:
https://leetcode.com/problems/check-if-two-string-arrays-are-equivalent/

力扣中国版
https://leetcode-cn.com/problems/check-if-two-string-arrays-are-equivalent/

方案一:拼接字符串

public class Solution 
    public bool ArrayStringsAreEqual(string[] word1, string[] word2) 
        string a1 = String.Join("",word1);
        string a2 = String.Join("",word2);
        if(a1 == a2)
            return true;
        else
            return false;
    

这个算是本题的暴力解法吧,不过本题暴力解法是最快的(80ms)。因为数量级的问题,这里的数量级是1000。所以这里特别尴尬。

在Leetcode美国版,是有dislike的,dislike的人数已经达到了105人,而like的人是627人。

方案二:双指针

双指针是大家比较容易想到的常规解法。不过,这里因为指针要跨字符,所以还是比较麻烦的。

public class Solution 
    public bool ArrayStringsAreEqual(string[] word1, string[] word2) 
        var n1 = word1.Length;
        var n2 = word2.Length;
        var w1 = 0;
        var c1 = 0;
        var w2 = 0;
        var c2 = 0;
        while (w1 < n1 && w2 < n2) 
            if (word1[w1][c1] != word2[w2][c2]) return false;
            
            c1++;
            c2++;
            if (c1 == word1[w1].Length) 
                c1 = 0;
                w1++;
            
            
            if (c2 == word2[w2].Length) 
                c2 = 0;
                w2++;
            
        
        
        return w1 == n1 && w2 == n2 && c1 == 0 && c2 == 0;
    

这个运行了114ms。虽然比暴力法慢了,但是如果我是面试官,显然我更希望面试者能用双指针。

IEnumerator

在给出方案三之前,我们先回顾一下什么是Enumerator。Enumerator,按照我的理解,就是有一个指针,一次移动一下,可以返回当前值。它可以实现指针的逻辑和其他逻辑的分离,让代码更清晰。有的时候,比如本题,也比直接用指针更易读。
以下是泛型接口的代码:

public interface IEnumerator<T>


    bool MoveNext();
    T Current  get; 
    void Reset();

MoveNext让指针往前走一步。如果成功,返回true,失败返回false。如果IEnumerator已经穷尽,则失败,返回false。
Current返回当前值。
Reset重置指针。

我们用yield return生成IEnumerator,比如

public IEnumerator<int> GetIntOneByOne()

	int[] a = new int[]1,2,3,4;
	for(int i=0;i<4;i++)
	
		yield return a[i];
	

方案三:IEnumerator

我们的这个问题,其实是相当经典的用IEnumerator的场景。这里其实是双重循环,取元素。用IEnumerator会方便很多。

private IEnumerator<char> Generate(string[] words)

    foreach(string word in words)
    
        foreach(char c in word)
        
            yield return c;
        
    

看,是不是比直接用指针方便多了。

using System.Collections.Generic;

public class Solution

    private IEnumerator<char> Generate(string[] words)
    
        foreach(string word in words)
        
            foreach(char c in word)
            
                yield return c;
            
        
    

    public bool ArrayStringsAreEqual(string[] word1, string[] word2)
    
        IEnumerator<char> g1 = Generate(word1);
        IEnumerator<char> g2 = Generate(word2);
        char c1 = '\\0';
        char c2 = '\\0';

        while (c1 == c2)
        
            if (c1 != c2)
            
                return false;
            

            bool movable1 = g1.MoveNext();
            bool movable2 = g2.MoveNext();
            if (movable1 != movable2)
            
                return false;
            
            else if (!movable1)
            
                return true;
            
            
            c1 = g1.Current;
            c2 = g2.Current;
        

        return false;
    

如果我是面试官,第三种解法显然是我最满意的,我会优先录取。

以上是关于C#刷Leetcode 1662. 检查两个字符串数组是否相等 IEnumerator的主要内容,如果未能解决你的问题,请参考以下文章

C#刷Leetcode 1662. 检查两个字符串数组是否相等 IEnumerator

LeetCode 1662. 检查两个字符串数组是否相等

LeetCode1662. 检查两个字符串数组是否相等(C++)

LeetCode1662. 检查两个字符串数组是否相等(C++)

LeetCode 1662 检查两个字符串数组是否相等[数组] HERODING的LeetCode之路

LeetCode 1662. 检查两个字符串数组是否相等 / 795. 区间子数组个数 / 剑指 Offer 47. 礼物的最大价值