Okay, well this thread has been dead for sufficiently long time. Here is what I came up with; it takes quadratic time.

Graal Script Code:

```
``````
function onCreated() {
```

temp.p = getpatterns("THISISATESTSTRING");

for (temp.s: temp.p) {

if (this.(@"h_"@temp.s) >= 2)

echo(temp.s @ ": "@ this.(@"h_"@temp.s));

this.(@"h_"@temp.s) = 0; /* clean-up */

}

}

function getpatterns(s) {

temp.l = s.length();

for (temp.i=0; temp.i<temp.l-1; temp.i++) {

temp.c = s.charat(temp.i);

for (temp.j=temp.i+1;temp.j<temp.l;temp.j++) {

temp.c @= s.charat(temp.j);

this.(@"h_"@temp.c) ++;

temp.pat.add(temp.c);

}

}

return temp.pat;

}

Perhaps there are still improvements to be made.