forked from dylansun/leetcode-cn-scala
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNo32.scala
57 lines (53 loc) · 1.42 KB
/
No32.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**
* Created by lilisun on 2/28/19.
*/
object No32 {
def longestValidParentheses(s: String): Int = solver1(s)
//TLE solver2 TODO
def solver2(s: String):Int = {
var t0 = s.map(x => if(x == '(') 'l' else 'r')
var t1 = t0.replace("lr", "#")
if(t0 == t1) return 0
t0 = t1
var count = 1
while(count <= s.length / 2 ){
val tag = ntag(count, "#", "")
val patten = "l"+tag+"r"
t1 = t0
t0 = t1.replaceAll(patten, "#"+tag)
count += 1
}
(t1.split("l|r") map f).max * 2
}
def ntag(x:Int, tag: String, acc: String):String = x match {
case 0 => acc
case _ => ntag(x-1,tag,tag + acc)
}
def f(x:String):Int = x.length
def solver1(s: String): Int =
{
val candidate = for(x <- 0 until s.length) yield lvp(s.toCharArray.toList.slice(x, s.length), Nil, 0, 0)
candidate.max
}
def lvp(s: List[Char], stack: List[Char], c: Int, m: Int): Int = {
s match {
case Nil => m
case '('::t0 => lvp(t0, '(' :: stack, c, m)
case ')'::t0 => stack match {
case Nil => lvp(t0, Nil, 0 , m max c)
case '('::t1 => if(t1.isEmpty){
lvp(t0, t1, c+2, m max (c+2))
}else{
lvp(t0, t1, c+2, m)
}
}
}
}
def main(args: Array[String]): Unit = {
val s = "()(()(())("
val ans = "r#l#l##l"
val k = ans.split("l|r") map f
println(k.mkString)
println(longestValidParentheses("(()())"))
}
}