首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

超级郁闷,4个方法都“Memory limit exceeded”解决办法

2012-01-08 
超级郁闷,4个方法都“Memory limit exceeded”题目是这样的:输入一个字符串,如果这个字符串是由in,input,out

超级郁闷,4个方法都“Memory limit exceeded”
题目是这样的:
输入一个字符串,如果这个字符串是由in,input,out,output,puton,one组成,就返回YES,否则返回NO。
时间限制是1秒,内存限制16M。每个字符串长度不超过10^7个字符。


方法一:

C# code
using System;using System.Text.RegularExpressions;class Program{static void Main(string[] args){int lenNum = int.Parse(Console.ReadLine());for (int i = 0; i < lenNum; i++){if (Regex.IsMatch(Console.ReadLine(), "^(?:one|out(?:put)?|in(?:put)?|puton)+$")) Console.WriteLine("YES");else Console.WriteLine("NO");}}}



方法二:
C# code
using System;class Program{static void Main(string[] args){int lenNum = int.Parse(Console.ReadLine());for (int i = 0; i < lenNum; i++){if (Console.ReadLine().Replace("one","").Replace("puton","").Replace("output","").Replace("input","").Replace("out","").Replace("in","")=="") Console.WriteLine("YES");else Console.WriteLine("NO");}}}



方法三:
C# code
using System;class Program{static void Main(string[] args){int lenNum = int.Parse(Console.ReadLine());for (int i = 0; i < lenNum; i++)Console.WriteLine(Judge(Console.ReadLine()));}static string Judge(string input){int pos = 0;for (int i = input.Length - 1; i >= 0; i--){pos++;if (pos == 1||pos==4) continue;else if (pos == 2){if (input.Substring(i, pos) == "in") pos = 0;else continue;}else if (pos == 3){if (input.Substring(i, pos) == "one" || input.Substring(i, pos) == "out") pos = 0;else continue;}else if (pos == 5){if (input.Substring(i, pos) == "input" || input.Substring(i, pos) == "puton") pos = 0;else continue;}else{if (input.Substring(i, pos) == "output") pos = 0;else return "NO";}}if (pos==0) return "YES";else return "NO";}}


方法四:
C# code
using System;    class Program    {        static void Main(string[] args)        {            int lenNum = int.Parse(Console.ReadLine());            for (int i = 0; i < lenNum; i++)                Console.WriteLine(JudgeInput(Console.ReadLine()));}        static string JudgeInput(string input)        {            int pos = 0;            for (int i = input.Length - 1; i >= 0; i--)            {                pos++;                switch (input[i])                {                    case 'p':                        if (pos == 5)                        {                            if (input.Substring(i, 5) == "puton") pos = 0;                            else pos = -1;                        }                        break;                    case 'i':                         if (pos==2||pos==5)                        {                            if(input.Substring(i, pos) == "in"||input.Substring(i, pos) == "input") pos = 0;                             else pos = -1;                        }                        else pos=-1;break;                    case 'o':                        if (pos == 3)                        {                            if (input.Substring(i, pos) == "one" || input.Substring(i, pos) == "out") pos = 0;                            else pos = -1;                        }                        else if (pos == 6)                        {                            if (input.Substring(i, 6) == "output") pos = 0;                            else pos = -1;                        }                        break;                    case 'n':                    case 'e':                    case 't':                    case 'u': break;                    default: pos = -1; break;                }                if (pos < 0 || pos > 7) return "NO";            }            if (pos==0) return "YES";            else return "NO";        }} 


 
 


[解决办法]
用泛型比较快,减少了装箱拆箱操作。。
[解决办法]
有测试数据没.. 用StringBuilder改了下第2个,你可以试试~~
原方法生成的对象太多

C# code
using System;using System.Text;class Program{    static void Main(string[] args)    {        StringBuilder sb = new StringBuilder();        int lenNum = int.Parse(Console.ReadLine());        for (int i = 0; i < lenNum; i++)        {            sb.Append(Console.ReadLine()).Replace("one", "").Replace("puton", "").Replace("output", "").Replace("input", "").Replace("out", "").Replace("in", "");            if (sb.Length==0)            {                Console.WriteLine("YES");            }            else            {                Console.WriteLine("NO");                sb.Length = 0;            }        }    }}
[解决办法]
你先把输入的数据转换为charArray,然后再分析,可能就不会有问题
[解决办法]
我觉得可以利用有限自动机的状态转换来解决,读取字符串的时候一个字符一个字符来读,然后进行状态的转换.
[解决办法]
我觉得lz的意思理解错了,粗略的看了一下

one 和puton是两个对象,他们可以说话
one可以说puton,out,output这三个词
puton可以说in,input,one这三个词

我的理解是,
字符串必须用one或者puton开头
out和output之前必须有one
in,input之前必须有puton

[解决办法]
如果是内存超出了,可以试试别用字符串,直接从Console.Read()一个一个读取。
不知道是否会省一些内存!

热点排行