C#刷Leetcode 1662. 检查两个字符串数组是否相等 IEnumerator
Posted 织网者Eric
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
LeetCode1662. 检查两个字符串数组是否相等(C++)
LeetCode1662. 检查两个字符串数组是否相等(C++)
LeetCode 1662 检查两个字符串数组是否相等[数组] HERODING的LeetCode之路
LeetCode 1662. 检查两个字符串数组是否相等 / 795. 区间子数组个数 / 剑指 Offer 47. 礼物的最大价值