Advertisement
Guest User

Untitled

a guest
May 27th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.92 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ReverseShuffleMerge_P4
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. runTestCases();
  14. //Console.WriteLine(reverseShuffleMerge(Console.ReadLine()));
  15. }
  16.  
  17. public static void runTestCases()
  18. {
  19. string[] testCases = new string[4] { "abcacb", "aaccbb", "cacbab", "baabcc" };
  20.  
  21. List<string> outputStrs = new List<string>();
  22. foreach (string s in testCases)
  23. {
  24. string s2 = reverseShuffleMerge(s);
  25.  
  26. outputStrs.Add(s2);
  27. }
  28.  
  29. string[] result = outputStrs.ToArray();
  30. }
  31.  
  32. /*
  33. * practice - write code ready to be compiled and executed.
  34. *
  35. */
  36. public static string reverseShuffleMerge(string input)
  37. {
  38. if (input == null || input.Length == 0)
  39. return null;
  40.  
  41. int TOTALCHARS = 26;
  42. int len = input.Length;
  43.  
  44. int[] moreToAdd = new int[TOTALCHARS];
  45. int[] moreToSkip = new int[TOTALCHARS];
  46.  
  47. foreach(char c in input)
  48. {
  49. moreToAdd[getIndex(c)]++;
  50. }
  51.  
  52. for(int i=0; i< TOTALCHARS; i++)
  53. {
  54. moreToAdd[i] = moreToAdd[i] / 2;
  55. //moreToSkip[i] = moreToAdd[i] / 2; // bug - 9:49pm - May 26/2016
  56. moreToSkip[i] = moreToAdd[i];
  57. }
  58.  
  59. Stack<char> stack = new Stack<char>();
  60.  
  61. for(int i = len - 1; i >= 0; i--) // reverse order
  62. {
  63. char runner = input[i];
  64. int index = getIndex(runner);
  65.  
  66. // stack is not empty, and need to add one more char - runner,
  67. // top of stack - char > runner
  68. // top of stack - char - can be skipped if backtracked.
  69. while(
  70. stack.Count > 0 &&
  71. moreToAdd[index] > 0 &&
  72. ((char)stack.Peek() > runner) &&
  73. moreToSkip[getIndex((char)stack.Peek())] > 0
  74. )
  75. {
  76. char backTracked = (char)stack.Pop();
  77. int oldIndex = getIndex(backTracked);
  78.  
  79. moreToAdd[oldIndex]++;
  80. moreToSkip[oldIndex]--;
  81. }
  82.  
  83. if(moreToAdd[index] > 0)
  84. {
  85. stack.Push(runner);
  86. moreToAdd[index]--;
  87. }
  88. else
  89. {
  90. moreToSkip[index]--;
  91. }
  92. }
  93.  
  94. char[] arr = stack.ToArray();
  95. Array.Reverse(arr);
  96.  
  97. return new string(arr);
  98. }
  99.  
  100. private static int getIndex(char c)
  101. {
  102. return c - 'a';
  103. }
  104. }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement