CSES - Kaksi merkkiä

Tehtäväsi on laskea, monessako merkkijonon osajonossa on tasan kahta eri merkkiä. Esimerkiksi merkkijonossa aabacba tällaiset osajonot ovat

  • aab
  • aaba
  • ab
  • aba
  • ac
  • ba (kahdesti)
  • cb

eli yhteensä 8 osajonoa.

Voit olettaa, että merkkijono muodostuu merkeistä az ja siinä on enintään 10^5 merkkiä. Tavoitteena on, että algoritmin aikavaativuus on O(n).

Python

Toteuta tiedostoon twochar.py funktio count, joka ilmoittaa osajonojen määrän.

def count(s):
    # TODO

if __name__ == "__main__":
    print(count("aaaa")) # 0
    print(count("abab")) # 6
    print(count("aabacba")) # 8
    print(count("abacaadbaacaa")) # 21

Java

Toteuta tiedostoon TwoChar.java metodi count, joka ilmoittaa osajonojen määrän.

public class TwoChar {
    public long count(String s) {
        // TODO
    }

    public static void main(String[] args) {
        TwoChar t = new TwoChar();
        System.out.println(t.count("aaaa")); // 0
        System.out.println(t.count("abab")); // 6
        System.out.println(t.count("aabacba")); // 8
        System.out.println(t.count("abacaadbaacaa")); // 21
    }
}